Memory leaks 如何诊断Java8元空间泄漏?

Memory leaks 如何诊断Java8元空间泄漏?,memory-leaks,java-8,classloader,permgen,metaspace,Memory Leaks,Java 8,Classloader,Permgen,Metaspace,我有一个具有一些有趣行为的J2EE应用程序。。。堆的行为似乎很好,随着时间的推移,垃圾收集会不断增加和减少。没有明显的总体长期堆扩展。然而,元空间一直以每小时20MB的速度稳定增长,直到我们碰到MaxMetaspace并遇到OOME。我尝试过并行和G1垃圾收集器(jdk1.8.0_40) 应用程序在执行过程中没有被重新部署,因此它看起来不像是典型的类加载器泄漏。有没有人对如何追查这次泄漏的源头有什么建议 java.lang.OutOfMemoryError:Metaspace的主要原因是: 课

我有一个具有一些有趣行为的J2EE应用程序。。。堆的行为似乎很好,随着时间的推移,垃圾收集会不断增加和减少。没有明显的总体长期堆扩展。然而,元空间一直以每小时20MB的速度稳定增长,直到我们碰到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();
    }
  }
}
所有生成的类定义最终都会占用元空间

协助


您可以找到更多关于OOME的信息,请执行堆转储并使用进行分析。查看您已加载的类。检查是否存在意外情况,尤其是重复类。它还有一个类加载器资源管理器

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

你找到了这个问题的答案吗?你能提供更多信息吗:JEE服务器,使用过的库。这是一次尝试在JBoss 4.2.3.GA上运行Java 8下的遗留J2EE应用程序的尝试。这不是一个受支持的配置,但客户端确实想尝试它。我知道从那时起JBoss类加载发生了重大变化,所以我怀疑这是类加载程序的问题。Phillipe下面关于代理生成的猜测可能有一些价值。我们最终决定“咬紧牙关”,将应用程序移植到Wildfly 8。我也遇到了类似的问题,在抛出了应用程序元空间oom错误的多次重新部署之后,我们使用了Wildfly 10。增加最大元空间只是一种解决方法,而不是解决方案。我还没有找到任何解决方案。我们尝试了MAT classloader explorer。不幸的是,这个应用程序很忙,也很复杂,而且泄漏速度也很慢,所以它仍然是“大海捞针”的主张。这个配置本来是要作为一个临时解决方案,但我们已经到了收益递减的地步,所以我们放弃了。我不知道有什么问题。OP从未调试过这个问题,所以可能是任何问题,包括他/她的应用程序。您好,我在清理javassist.ClassPool对象时遇到问题。这是怎么做到的?