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