首页 > 解决方案 > 内存不足:元空间

问题描述

我在元空间中出现内存不足。正如我在谷歌搜索后理解的那样,元空间中的内存不足错误可能是由于 Classloader 中的泄漏。因此,为此我开始分析 Eclipse MAT 中的堆转储并打开“类加载器资源管理器”,它给出以下内容: 在此处输入图像描述

正如我从上述数据中了解到的那样,com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader 占用了 396,707 个未进行垃圾回收的实例。我的理解正确吗?

在我选择了这一行并打开“GC Roots 的路径 -> 排除所有幻象/弱/软 Ref”后,我观察到 Shallow Heap 和 Retained Heap 分别为 96 和 231,040。

在我为类 org.apache.felix.framework.BundleWiringImpl$BundleClassLoader 在“类加载器资源管理器”中选择另一行并再次打开“GC 根路径-> 排除所有幻象/弱/软引用”之后,现在我看到了这些数据:

在此处输入图像描述

从这些数据中,是否可以安全地得出结论,在此类中存在泄漏: com.newrelic.agent.util.DefaultThreadFactory$AgentThreadImpl 不是垃圾收集的?

如果没有,请建议我还应该检查什么?

标签: javagarbage-collectionout-of-memorynewreliceclipse-mat

解决方案


com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader 占用了 396,707 个没有被垃圾回收的实例。我的理解正确吗?这意味着com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader已经加载了 2627 个类,并且这些类有 396,707 个实例。就其本身而言,这看起来不是问题。

Duplicate Classes 可能是一个很好的查询,可以运行以查看一个类是否已加载到一个类加载器中,然后再次加载(可能是因为它已更新),但旧的类加载器没有被释放。

线程com.newrelic.agent.util.DefaultThreadFactory$AgentThreadImpl应该是活的。检查线程概述查询以了解它在做什么?


推荐阅读