0

我正在分析 IBM JVM 使用 Eclipse MAT 编写的 .phd 转储。

名为“gc_roots”的视图显示以下列表:

在此处输入图像描述

我可以确定 GC 根列表是完整的吗?
这是否意味着正在运行的线程堆栈中的所有局部变量都包含在“未知”部分中?

为什么它被命名为这样的BTW?

我对 GC 根列表完整性的怀疑是基于这样一个事实,即在抛出 OOM 时堆包含几个相当大的弱引用 char 缓冲区。这看起来违反了合同,因为即使是 SoftReferences 也必须在 OOM 之前清除。

更新

这是同时编写的核心转储中的 GC 根列表,这让我更不清楚。 在此处输入图像描述

没有“未知”部分,而是出现了“JNI Global”。而且我仍然想知道堆栈中的局部变量在哪里。

4

1 回答 1

0

最后的收集不适用于某些 OOME 原因。例如,大于最大堆大小的分配尝试显然永远无法满足,并且任何集合都不会改变这一点。

您应该检查 OOME 的 message 属性。

而且我仍然想知道堆栈中的局部变量在哪里。

大概是Thread类别。

于 2017-10-27T18:59:44.990 回答