在Java实例中跟踪GC暂停/停止时间的最佳方法是什么?
gc.log是否包含MXBean没有的任何其他信息?我更喜欢选项1,因为我希望实例将该指标发送到我们的监控系统。
我已经在SO上阅读了一些像this这样的帖子,但我似乎没有得到正确的答案。我特意寻找GC停滞时间,不在GC上花费的总时间。
答案 0 :(得分:5)
垃圾收集并不是JVM停止世界暂停的唯一原因 您也可以计算other reasons。
监控安全点暂停的第一种方法是解析VM日志:
-XX:+PrintGCApplicationStoppedTime
JVM选项; -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