Spring Boot Metaspace内存泄漏

时间:2015-08-11 15:57:59

标签: 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

1 个答案:

答案 0 :(得分:0)

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

超出PermGen空间容量

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

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

<强>诊断
 诊断与Jetty Web服务上的内存相关的问题的最有效方法是通过JMX连接到它并使用jconsole监视它。  默认情况下,Jetty上没有启用JMX,Spring Boot provides monitoring and management over JMX out of the box

我只猜测,但就您的应用而言,问题的原因可能就是您使用ehcache的方式。