Java 安全点&x2B;输出JDK12中无vmop操作的统计日志

Java 安全点&x2B;输出JDK12中无vmop操作的统计日志,java,jvm,zgc,Java,Jvm,Zgc,我使用-Xlog:safepoint+stats=debug:file=safepoint.logvm参数在JDK12上运行应用程序,以记录safepoint操作并使用ZGC运行。我无法理解日志输出: [1408.417s][debug][safepoint,stats] vmop [ threads: total initially_running wait_to_block ][ time: spin

我使用-Xlog:safepoint+stats=debug:file=safepoint.logvm参数在JDK12上运行应用程序,以记录safepoint操作并使用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
我理解第一行,它告诉我zooperation需要1毫秒,7个线程参与了阻塞

我不明白第二行,什么是“无”vmop操作?该操作的持续时间似乎为0。它真的是0,或者它是0,因为它不到1毫秒?如果是,可以设置更高的时间记录粒度,以查看需要多少纳秒?还是微秒


我每秒都会记录许多这种“无”操作。我想知道JVM在暂停期间正在做什么。我每10秒跟踪一次ZGC时间和安全点时间,聚合的安全点时间比聚合的gc暂停时间高5倍。我希望以某种方式减少我的应用程序的安全点时间。

这是一个没有VM操作的安全点。它的目的是执行周期性的清理任务,如清空空闲监视器或清除内联缓存缓冲区,这只有在没有Java线程运行时才能安全地完成

如果要执行清理任务,则每隔
guarantedSafePointInterval
毫秒会发生一次强制的安全点。默认值为1000。请注意,在您的情况下,没有操作安全点发生在上一个安全点后1秒

音程可以用调音器调整

-XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=<ms>
-XX:+UnlockDiagnosticVMOptions-XX:GuarantedSafePointInterval=
为了避免混淆,在JDK13中,这样的无操作安全点得到了
Cleanup
操作名