【发布时间】:2018-04-09 05:40:58
【问题描述】:
我正在分析 IBM JVM 使用 Eclipse MAT 编写的 .phd 转储。
名为“gc_roots”的视图显示以下列表:
我可以确定 GC 根列表是完整的吗?
这是否意味着正在运行的线程堆栈中的所有局部变量都包含在“未知”部分中?
为什么它被命名为这样的BTW?
我对 GC 根列表完整性的怀疑是基于这样一个事实,即在抛出 OOM 时堆包含几个相当大的弱引用字符缓冲区。这看起来违反了合同,因为即使是 SoftReferences 也必须在 OOM 之前清除。
更新
没有“未知”部分,而是出现了“JNI Global”。而且我仍然想知道堆栈中的局部变量在哪里。
【问题讨论】:
-
这些缓冲区可能被引用它们的其他对象保持活动状态。 gc 根列表应该是完整的,除非 JVM 中存在重大错误。如果它不完整,则意味着 JVM 泄漏内存,这当然不好。
-
根据这两个转储,没有其他GC根路径,只有一个通过ThreadLocal,包含WeakReference。
-
但是为什么你认为这里缺少一些 GC 根就意味着泄漏?
-
当 OOME 被抛出时,您正在使用一些 JVM 选项来生成堆转储,对吧?否则对象的可达性可能会同时发生变化,例如因为堆栈是由 throw 展开的。
-
是的,没错,转储是在 OOME 上自动生成的。
标签: java garbage-collection out-of-memory websphere gc-roots