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