我们有一种情况,springboot 微服务的元空间不断增长,但堆表现良好。
jmap -clstats 显示有成千上万的以下类型的死类加载器。
0x00000000e3c8e3c8 1 4087 0x00000000e0004d18 死 com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl$TransletClassLoader@0x000000010087c7e8
在最初的高水位 GC 被触发,我看到元空间下降。在由于定义的元空间大小而触发的强制 GC 之后,我看到元空间不断增长,并且我看到更多相同类型的死类加载器被保留在元空间中。我确实看到了一些 GC 活动,但元空间消耗没有下降。但是,如果我通过 visualvm 强制 GC 收集,则会卸载大量类,并且元空间消耗将回到服务启动时的状态。
为什么 JVM 管理的 GC 不会卸载这些死掉的类加载器,而强制 GC 会呢?如果弱/软/幻像引用是原因,那么它不应该也适用于强制 GC 吗?
这是在Java8上。任何人都可以就我接下来应该看的地方给出一些指示吗?显然存在泄漏,那么有没有办法知道 TemplatesImpl$TransletClassLoader 的父类加载器?
感谢任何帮助。