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

问题描述 投票:2回答:4

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

garbage-collection jvm websphere heap-dump
4个回答
3
投票

您可以生成“系统转储”而不是“堆转储”。我还没有找到任何文档,但是我只是尝试了一下,看来“系统转储”没有触发“系统GC”。

可以通过generateSystemDump JMX操作请求“系统转储”。如果您更喜欢使用kill -3命令,则可能需要将环境变量添加到JVM:

JAVA_DUMP_OPTS=ONDUMP(SYSDUMP)

“系统转储”需要在加载到Eclipse MAT之前用jextract工具进行处理。系统转储也比堆转储大得多,主要是因为它不仅包含对象树,而且还包含实际的对象数据。


2
投票

在IBM JRE中,您可以通过添加-Xdisableexplicitgc作为JVM参数来禁用显式GC。但是基于this article,似乎该参数无济于事。

也许IBM的PMR支持会有所帮助。


1
投票

考虑热点,没有参数会影响转储堆时VM的行为。通常,在转储堆之前会触发GC收集。

您至少可以在Full GC之前/之后启用类直方图打印-这样,您将看到收集了哪些对象。 (XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC

您也可以尝试-XX:+DisableExplicitGC,但我认为这没有帮助。当我收集堆转储时,我总是会注意到一些对象正在收集。


0
投票

只是碰到了这篇文章,我以为我要放两个鲍勃。您可以通过WebSphere Adminconsole生成系统核心:导航对故障排除> Java转储和核心。选择要从中收集转储的服务器。单击系统转储以产生系统核心。

如果只需要在MAT中进行堆内存分析,则也不需要解压缩系统核心。与堆转储相比,系统核心还具有许多有用的诊断数据,大多数时候您可以看到正在泄漏堆内存的线程堆栈

© www.soinside.com 2019 - 2024. All rights reserved.