我有一个具有一些有趣行为的 J2EE 应用程序...堆似乎表现良好,随着时间的推移,随着垃圾收集的进行而增长和收缩。总体上没有明显的长期堆扩展。然而,元空间一直以每小时 20 Mb 左右的速度稳定增长,直到达到 MaxMetaspace 并遇到 OOME。我尝试过并行和 G1 垃圾收集器(jdk1.8.0_40)。
应用程序在执行期间不会重新部署,因此看起来这不是典型的类加载器泄漏。有人对如何追踪这次泄漏的来源有建议吗?
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();
}
}
}
所有这些生成的类定义最终都会消耗元空间。
Java助手Maven 仓库 http://mvnrepository.com/artifact/javassist/javassist.
您可以找到更多有关 OOME 的信息here https://plumbr.eu/outofmemoryerror/metaspace
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)