我正在努力解决此问题
java.lang.OutOfMemoryError: Metaspace
重新部署时在Tomcat 8.0.18上运行Web应用程序(Apache Roller,Java EE Weblogger软件:https://roller.apache.org)。
我知道问题的原因可以通过Eclipse Memory Analyzer找到,所以我在OOME时得到了一个堆转储,该堆转储由JVM自动生成,并与
-XX:+HeapDumpOnOutOfMemoryError.
我可以看到有4个WebappClassLoader实例应该被垃圾回收。但我不确定为什么这些实例没有被垃圾收集。
因此,这是我在
Merge Shortest Paths to GC Roots => exclude all phantom/weak/soft/etc. references
屏幕中针对每个WebappClassLoader
实例的问题:这是否意味着PostgreSQL JDBC驱动程序(在服务器端部署)具有对RollerContext的引用?
看起来
SoftEntryReference
的一个实例具有对WebappClassLoader
的引用,但是我想它不是一个强引用,因此它不会阻止WebappClassLoader
被垃圾回收。我错了吗?我不知道这是什么意思...这是什么意思?
WebappClassLoader
本身是否可以防止被垃圾回收?就像我在2中所写的那样,我猜应该将其作为垃圾回收,因为它由SoftReference引用。我错了吗?
最佳答案
这是否意味着PostgreSQL JDBC驱动程序(在服务器端部署)具有对RollerContext的引用?
是的,看起来是这样。特别是通过保存在静态变量中的异常对象的回溯。
合并最短路径到GC根=>排除所有幻像/弱/软/等。参考资料
[...]
这看起来像是SoftEntryReference的实例具有对WebappClassLoader的引用,但我想它不是一个强引用
[...]
就像我在2中所写的那样,我猜应该将其作为垃圾回收,因为它由SoftReference引用。我错了吗?
你错了。
就垃圾收集器而言,您并不是在看软引用。软引用对象中只有一个字段不强,这就是referent
字段。
在JDK的java.lang.ref.Reference<T>
类内部,您会发现还有其他字段。您还将注意到,SoftReference
是可子类化的,因此可以具有其他字段。所有非引用字段均为强引用。
MAT表示您正在查看的内容由discovered
字段链保留,这意味着即使引用对象可能已被回收,引用对象也肯定处于活动状态。
我不知道这是什么意思...这是什么意思? WebappClassLoader本身是否可以防止垃圾回收?
在eclipse docs中对此进行了说明:这是GC的根,因为对该对象持有了锁,并且当前由本机代码(例如JNI。
这是"eclipse mat busy monitor"的第一个Google搜索结果。请做你的研究。