如何禁用在WebSphere中触发堆转储时发生的Systemic GC?

时间:2013-01-02 19:31:05

标签: garbage-collection jvm websphere heap-dump

我想捕获在生成堆转储时发生的System GC期间收集的对象。有没有办法禁用该系统GC?

4 个答案:

答案 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中进行堆内存分析,那么您也不需要解压缩系统核心。与堆转储相比,系统核心还具有更多有用的诊断数据,大多数时候您可以看到泄漏堆内存的线程堆栈