测量GC暂停时间的最佳方法是什么?

时间:2018-05-16 22:32:54

标签: java garbage-collection jvm

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

  1. 可以从垃圾收集器GarbageCollectorMXBean中检索吗?
  2. 可以从gc.log中读取吗?
  3. gc.log是否包含MXBean没有的任何其他信息?我更喜欢选项1,因为我希望实例将该指标发送到我们的监控系统。

    我已经在SO上阅读了一些像this这样的帖子,但我似乎没有得到正确的答案。我特意寻找GC停滞时间,在GC上花费的总时间。

2 个答案:

答案 0 :(得分:5)

垃圾收集并不是JVM停止世界暂停的唯一原因 您也可以计算other reasons

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

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

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

第二种方法是使用未记录的 Hotspot内部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中的讨论。

答案 1 :(得分:1)

  

我特意寻找GC失速时间

停止时间比GC本身还要多。获取安全点的时间也是应用程序停顿,仅作为部分日志记录提供,而不是通过MXBeans

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