【发布时间】:2012-12-17 04:04:40
【问题描述】:
我想捕获在生成堆转储时发生的系统 GC 期间收集的对象。有没有办法禁用该系统 GC?
【问题讨论】:
-
你使用的是哪个 JVM?
-
IBM,抱歉,我应该注意到这一点。虽然我确实将它标记为 WebSphere ... :)
标签: garbage-collection jvm websphere heap-dump
我想捕获在生成堆转储时发生的系统 GC 期间收集的对象。有没有办法禁用该系统 GC?
【问题讨论】:
标签: garbage-collection jvm websphere heap-dump
刚刚看到这篇文章,我想我应该把我的两个 bob 放进去。您可以通过 WebSphere Adminconsole 生成一个系统核心: 导航到故障排除 > Java 转储和核心。 选择要从中收集转储的服务器。 点击 System Dump 生成系统内核。
如果您只需要在 MAT 中进行堆内存分析,您也不需要 jextract 系统内核。系统核心也有比堆转储更多有用的诊断数据,大多数时候你可以看到正在泄漏堆内存的线程堆栈
【讨论】:
您可以生成“系统转储”而不是“堆转储”。我还没有找到任何文档,但我只是尝试过,似乎“系统转储”不会触发“系统 GC”。
可以使用generateSystemDump JMX 操作请求“系统转储”。如果您更喜欢使用kill -3 命令,那么您可能需要将环境变量添加到您的 JVM:
JAVA_DUMP_OPTS=ONDUMP(SYSDUMP)
在加载到 Eclipse MAT 之前,需要使用jextract 工具处理“系统转储”。系统转储也比堆转储大得多,主要是因为它不仅包含对象树,还包含实际的对象数据。
【讨论】:
在 IBM JRE 中,您可以通过添加 -Xdisableexplicitgc 作为 JVM 参数来禁用显式 GC。然而,基于this article,这个论点似乎无济于事。
也许向 IBM 提供 PMR 支持会有所帮助。
【讨论】:
考虑到 Hotspot,在转储堆时没有影响 VM 行为的参数。通常,在转储堆之前触发 GC 收集。
您至少可以在 Full GC 之前/之后启用类直方图打印 - 这样您将看到收集了哪些对象。 (XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC)
您也可以尝试-XX:+DisableExplicitGC,但我认为这不会有帮助。当我收集堆转储时,我总是注意到一些对象正在被收集。
【讨论】: