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

时间:2015-04-02 22:14:32

标签: memory-leaks java-8 classloader permgen metaspace

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

java.lang.OutOfMemoryError:Metaspace的主要原因是:

  • 太多类
  • 太大的类被加载到Metaspace。

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

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();
    }
  }
}

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

Maven repo中的Javaassist。

您可以找到更多关于OOME here

的信息