我有一个J2EE应用程序,它有一些有趣的行为...堆似乎表现良好,随着时间的推移,随着时间的推移,随着垃圾收集的增加和缩小。总体上没有明显的长期堆扩展。然而,元空间只是保持稳定增长,大约每小时20Mb,直到我们遇到MaxMetaspace并遇到OOME。我尝试过并行和G1垃圾收集器(jdk1.8.0_40)。
应用程序在执行过程中不会重新部署,因此看起来不像是典型的类加载器泄漏。有没有人有关于如何追踪这次泄漏的来源的建议?
发布于 2015-08-12 21:05:11
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();
}
}
}所有这些生成的类定义最终都会消耗Metaspace。
Maven repo中的Javaassist。
你可以找到更多关于OOME here的信息
发布于 2015-08-18 16:42:49
执行堆转储并使用Eclipse MAT对其进行分析。看看你加载的类。检查是否有意想不到的东西,特别是重复类。它还有一个类加载器浏览器。
编辑:从理论上讲,你也可以不断地生成代理。
https://stackoverflow.com/questions/29423390
复制相似问题