Spring 引导元空间内存泄漏

Spring Boot Metaspace Memory Leak

我正在使用 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 网络服务中发生的最常见的内存相关故障之一(遵循超出本机线程的最大数量 问题和超出capacity of the heap issue) is exceeding the capacity of the permgen (where 类 are allocated, transformed into MetaSpace 在 JDK 1.8 ).

超出 PermGen 的容量 Space

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

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

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

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