如何诊断Java 8元空间泄漏?

It *_*day 34 memory-leaks permgen classloader java-8 metaspace

我有一个带有一些有趣行为的J2EE应用程序......堆似乎表现良好,随着时间的推移随着垃圾收集而增长和缩小.没有明显的整体长期堆扩展.然而,在我们遇到MaxMetaspace并遇到OOME之前,元空间一直稳定地以每小时20 Mb的速度增长.我尝试了并行和G1垃圾收集器(jdk1.8.0_40).

应用程序在执行期间没有重新部署,因此它似乎不是典型的类加载器泄漏.有没有人建议如何追查这个泄漏的来源?

Phi*_*all 7

进行堆转储并使用Eclipse MAT进行分析.查看已加载的类.检查是否有意外的事情,特别是重复的类.它还有一个classloader资源管理器.

编辑:从理论上讲,您也可以不断地生成代理.


Kar*_*ról 5

java.lang.OutOfMemoryError:元空间的主要原因是:

  • 太多的课程
  • 太大的类正在加载到元空间。

如果要重新创建问题,请使用以下代码片段:

public class Metaspace {
static javassist.ClassPool cp = javassist.ClassPool.getDefault();

public static void main(String[] args) throws Exception {
    for (int i = 0; ; i++) { 
        Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所有这些生成的类定义最终都会消耗Metaspace。

Maven回购中的 Javaassist 。

您可以在此处找到有关OOME的更多信息