java - Spring Boot 元空间内存泄漏

标签 java spring spring-boot java-8 metaspace

我正在使用 Spring Boot 1.2.5 和 Java 1.8.0_51,一旦应用程序启动并运行,元空间就会以大约每小时 10MB 的速度增长。似乎是类加载泄漏之类的,我只是无法弄清楚是什么原因造成的。

应用程序正在使用 Jetty 而不是 Tomcat 运行。

我有一个正在运行的 Reactor 事件循环和几个计划的进程。然而,当我拒绝它们时,这些情况会继续发生。

这些是我正在使用的一些库:

spring-boot-starter-actuator
spring-boot-starter-aop
spring-boot-starter-data-jpa
spring-boot-starter-data-rest
spring-boot-starter-security
reactor-spring-context
hibernate-ehcache

最佳答案

Jetty 网络服务中发生的最常见的内存相关故障之一(遵循超出 native 线程的最大数量问题和超出堆容量问题) 超出 permgen 的容量(在 JDK 1.8 中分配类,转换为 MetaSpace)。

超出PermGen空间的容量

原因:
- 安装在Jetty上的应用动态生成类,PermGen/Metaspace空间应该增加。
- 一个库或一段应用程序代码正在动态创建无限数量的不符合垃圾回收条件的类。

示例:
MessagePack 为 MessagePack 的每个实例生成模板类,其中这些实例缓存每个实例的模板。如果应用程序创建了过多的 MessagePack 实例,很可能会生成过多的类,最终会导致内存故障。

诊断:
在 Jetty Web 服务上诊断与内存相关的问题的最有效方法是通过 JMX 连接到它并使用 jconsole 对其进行监控。 . 默认情况下 JMX 未在 Jetty 上启用,但 Spring Boot provides monitoring and management over JMX out of the box .

我只是猜测,但对于您的应用程序,问题的原因可能是您使用 ehcache 的方式。

关于java - Spring Boot 元空间内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946579/

相关文章:

调用 File.transferTo() 时 java.nio.file.NoSuchFileException

java - Accumulo 表扫描器在 Java 中静默失败

java - 有没有办法从 .xsd 架构生成 java.awt.Image?

java - Android 2.3.3,在 View 中创建一行

java - eclipse无法导入javax怎么解决?

java - 如何在 servlet-context 中引用 bean 的属性?

java - SpringApplication.run 后不打印 Logback

java - 使用守护进程(jsvc)将资源文件添加到类路径

java - 在@SpringBootTest中测试@Async注释的方法

java - Spring JMSListener - 它应该如何处理空负载?