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