我正在使用 -Xlog:safepoint + stats = debug:file = safepoint.log vm参数在JDK12上运行应用程序,以记录安全点操作并与ZGC一起运行。我有问题要了解日志输出:
[1408.417s][debug][safepoint,stats] vmop [ threads: total initially_running wait_to_block ][ time: spin block sync cleanup vmop ] page_trap_count
[1412.164s][debug][safepoint,stats] 1412.162: ZOperation [ 376 0 7 ][ 0 0 0 0 1 ] 7
[1413.164s][debug][safepoint,stats] 1413.164: None [ 376 0 0 ][ 0 0 0 0 0 ] 0
[1414.165s][debug][safepoint,stats] 1414.164: None [ 376 0 1 ][ 0 0 0 0 0 ] 1
我知道第一行告诉我们ZOperation用了1毫秒,并且有7个线程参与了阻塞。
我不明白第二行,什么是“无” vmop操作?看起来该操作的持续时间为0。实际上是0还是0,因为它花费了不到1毫秒的时间?如果是,则可以设置更高的时间记录粒度,以查看花费了多少纳秒?或微秒?
我每秒都记录了许多此“无”操作。我想知道在此暂停期间JVM在做什么。我每10秒钟跟踪一次ZGC时间和SafePoint时间,汇总的安全点时间比汇总的gc暂停时间高5倍。我想以某种方式减少我的应用程序的安全点时间。
答案 0 :(得分:2)
这是没有VM操作的安全点。它的目的是执行定期清理任务,例如缩小空闲监视器或清除内联高速缓存缓冲区,只有在没有Java线程运行时,才能安全地完成这些工作。
如果要执行清理任务,则每GuaranteedSafepointInterval
毫秒发生一次强制安全点。默认值为1000。请注意,在这种情况下,无操作安全点恰好在前一个安全点之后1秒发生。
间隔可以用
调整-XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=<ms>
为避免混淆,在JDK 13中,此类无操作安全点获得了Cleanup
操作名称。