2

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

4

4 回答 4

3

您可以生成“系统转储”而不是“堆转储”。我还没有找到任何文档,但我只是尝试过,似乎“系统转储”不会触发“系统 GC”。

可以使用generateSystemDumpJMX 操作请求“系统转储”。如果您更喜欢使用kill -3命令,那么您可能需要向 JVM 添加一个环境变量:

JAVA_DUMP_OPTS=ONDUMP(SYSDUMP)

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

于 2013-01-03T11:21:20.367 回答
2

在 IBM JRE 中,您可以通过添加-Xdisableexplicitgc为 JVM 参数来禁用显式 GC。然而,基于这篇文章,这个论点似乎无济于事。

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

于 2013-01-03T08:31:38.433 回答
1

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

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

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

于 2013-01-02T21:40:55.897 回答
0

刚刚看到这篇文章,我想我应该把我的两个 bob 放进去。您可以通过 WebSphere Adminconsole 生成一个系统核心:导航到故障排除 > Java 转储和核心。选择要从中收集转储的服务器。单击 System Dump 以生成系统核心。

如果您只需要在 MAT 中进行堆内存分析,您也不需要提取系统内核。系统核心也有比堆转储更多有用的诊断数据,大多数时候你可以看到正在泄漏堆内存的线程堆栈

于 2020-03-26T08:41:38.003 回答