问题描述
我的 Metaspace 内存不足。正如我在谷歌搜索后发现元空间内存不足错误可能是由于类加载器中的泄漏造成的。 因此,为此我开始分析 Eclipse MAT 中的堆转储并打开“类加载器资源管理器”,其中提供以下信息:
我从上述数据中了解到,com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader 占用了 396,707 个未被垃圾回收的实例。我的理解正确吗?
在我选择这一行并打开“Path to GC Roots -> exclude all phantom/weak/soft Ref”后,我观察到浅堆和保留堆分别为 96 和 231,040。
在“类加载器资源管理器”中为 org.apache.Felix.framework.BundleWiringImpl$BundleClassLoader 类选择另一行并再次打开“GC 根路径 -> 排除所有幻像/弱/软引用”后,现在我看到这个数据:
从这些数据中,是否可以断定此类中存在泄漏:com.newrelic.agent.util.DefaultThreadFactory$AgentThreadImpl 未进行垃圾收集?
如果没有,请建议我还应该检查什么?
解决方法
com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader 占用了 396,707 个未被垃圾回收的实例。我的理解正确吗?
这意味着 com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader
已加载 2627 个类,并且这些类有 396,707 个实例。就其本身而言,这看起来不成问题。
重复类可能是一个很好的查询,可以运行以查看类是否已在一个类加载器中加载,然后再次加载(可能是因为它已更新),但旧的类加载器没有被释放。
线程 com.newrelic.agent.util.DefaultThreadFactory$AgentThreadImpl
是否应该活着。检查线程概览查询以了解它在做什么?