我有一个带有一些有趣行为的J2EE应用程序......堆似乎表现得很好,随着时间的推移随着垃圾收集而增长和缩小。没有明显的整体长期堆扩展。然而,在我们遇到MaxMetaspace并遇到一个OOME之前,元空间一直稳定地以每小时20 Mb的速度增长。我已经尝试过并行和G1垃圾收集器(jdk1.8.0_40)。
应用程序在执行期间没有重新部署,因此它似乎不是典型的类加载器泄漏。有没有人建议如何追查这个泄漏的来源?
答案 0 :(得分:5)
执行堆转储并使用Eclipse MAT进行分析。查看已加载的类。检查是否有意外的事情,特别是重复的类。它还有一个classloader资源管理器。
编辑: 从理论上讲,你也可以不断地生成代理。
答案 1 :(得分:3)
java.lang.OutOfMemoryError: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
的信息