【问题标题】:How can I disable the Systemic GC that occurs when I trigger a heap dump in WebSphere?如何禁用在 WebSphere 中触发堆转储时发生的系统 GC?
【发布时间】:2012-12-17 04:04:40
【问题描述】:

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

【问题讨论】:

标签: garbage-collection jvm websphere heap-dump


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    JAVA_DUMP_OPTS=ONDUMP(SYSDUMP)
    

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

    【讨论】:

    • ... 您正在查找的对象列表将可通过 MAT 中的“无法访问的对象直方图”访问。
    • 谢谢,我试试看。 MAT 参考 +1。
    • @MarcinPłonka 这个 generateSystemDump JMX 操作是否仅适用于 WebSphere Application Server?
    【解决方案3】:

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

    也许向 IBM 提供 PMR 支持会有所帮助。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        • 2021-12-03
        • 1970-01-01
        • 2017-10-05
        • 1970-01-01
        • 2021-11-26
        相关资源
        最近更新 更多