【问题标题】:What is the best way to measure GC pause times?衡量 GC 暂停时间的最佳方法是什么?
【发布时间】:2018-05-16 22:32:54
【问题描述】:

在 Java 实例中跟踪 GC 暂停/停止时间的最佳方法是什么?

  1. 可以从垃圾收集器GarbageCollectorMXBean检索吗?
  2. 可以从 gc.log 中读取吗?

gc.log 是否有任何 MXBean 没有的附加信息?我更喜欢选项 1,因为我希望实例将该指标发送到我们的监控系统。

我已经阅读了一些类似this 这样的帖子,但我似乎没有得到正确的答案。我正在专门寻找 GC 停顿时间,而不是花费在 GC 上的总时间。

【问题讨论】:

  • 以前的答案有什么不“正确”的地方?显然,可以从任一来源读取信息,如果两个来源不一致,我会感到非常惊讶,因此选择哪一个取决于您觉得哪种访问方式更方便。
  • 更新了答案。

标签: java garbage-collection jvm


【解决方案1】:

垃圾收集并不是 JVM 停止世界的唯一原因。
你也可以数一下other reasons

监控安全点暂停的第一种方法是解析虚拟机日志:

  • 对于 JDK 8 及更早版本,添加 -XX:+PrintGCApplicationStoppedTime JVM 选项;
  • 从 JDK 9 开始添加 -Xlog:safepoint

然后在日志文件中查找Total time for which application threads were stopped 消息。

第二种方式是使用undocumented Hotspot internal MXBean:

sun.management.HotspotRuntimeMBean runtime =
        sun.management.ManagementFactoryHelper.getHotspotRuntimeMBean();

System.out.println("Safepoint time:  " + runtime.getTotalSafepointTime() + " ms");
System.out.println("Safepoint count: " + runtime.getSafepointCount());

它为您提供所有 JVM 暂停的累积时间。请参阅this answer 中的讨论。

【讨论】:

    【解决方案2】:

    我正在专门寻找 GC 停顿时间

    除了 GC 本身,还有更多的延迟时间。获取安全点的时间也是一个应用程序停顿,只能作为部分日志记录使用,而不是通过 MXBeans

    但实际上,如果您担心应用程序停顿,那么您实际上应该测量 GC 暂停或超过安全点时间。您应该自己测量摊位,例如通过 jhiccup

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2017-12-11
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多