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

cod*_*ter 2 java garbage-collection jvm

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

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

gc.log是否包含MXBean没有的任何其他信息?我更喜欢选项1,因为我希望实例将该度量标准发送到我们的监控系统.

我已经通过像几个帖子读对SO,但我似乎并没有越来越正确的答案.我特意寻找GC停滞时间而不是 GC上花费的总时间.

apa*_*gin 5

垃圾收集不是JVM停止世界停顿的唯一原因.
您也可能想要计算其他原因.

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

  • 对于JDK 8及更早版本添加-XX:+PrintGCApplicationStoppedTimeJVM选项;
  • 从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());
Run Code Online (Sandbox Code Playgroud)

它为您提供所有JVM暂停的累积时间.请参阅本答案中的讨论.