我正在努力解决此问题

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实例应该被垃圾回收。但我不确定为什么这些实例没有被垃圾收集。
java - 如何阅读Eclipse Memory Analyzer的“合并到GC根的最短路径”屏幕?-LMLPHP

因此,这是我在Merge Shortest Paths to GC Roots => exclude all phantom/weak/soft/etc. references屏幕中针对每个WebappClassLoader实例的问题:


这是否意味着PostgreSQL JDBC驱动程序(在服务器端部署)具有对RollerContext的引用?
java - 如何阅读Eclipse Memory Analyzer的“合并到GC根的最短路径”屏幕?-LMLPHP
看起来SoftEntryReference的一个实例具有对WebappClassLoader的引用,但是我想它不是一个强引用,因此它不会阻止WebappClassLoader被垃圾回收。我错了吗?
java - 如何阅读Eclipse Memory Analyzer的“合并到GC根的最短路径”屏幕?-LMLPHP
我不知道这是什么意思...这是什么意思? WebappClassLoader本身是否可以防止被垃圾回收?
java - 如何阅读Eclipse Memory Analyzer的“合并到GC根的最短路径”屏幕?-LMLPHP
就像我在2中所写的那样,我猜应该将其作为垃圾回收,因为它由SoftReference引用。我错了吗?
java - 如何阅读Eclipse Memory Analyzer的“合并到GC根的最短路径”屏幕?-LMLPHP

最佳答案

这是否意味着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搜索结果。请做你的研究。

09-12 23:27