输出 JDK12 中带有 None vmop 操作的 Safepoint+stats 日志

HPC*_*PCS 2 java jvm zgc

我正在使用-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
Run Code Online (Sandbox Code Playgroud)

我知道第一行告诉 ZOperation 花费了 1 毫秒,并且有 7 个线程参与了阻塞。

我不明白第二行,什么是“None” vmop 操作?看起来那个操作的持续时间是 0。它真的是 0 还是 0 因为它花了不到 1 毫秒?如果是,可以设置更高的时间记录粒度,以查看花费了多少纳秒?或微秒?

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

apa*_*gin 7

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

如果有清理任务要做,则每GuaranteedSafepointInterval毫秒都会发生一个强制安全点。默认值为 1000。请注意,在您的情况下,无操作安全点恰好发生在前一个安全点之后 1 秒。

间隔可以调整

-XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=<ms>
Run Code Online (Sandbox Code Playgroud)

为避免混淆,在 JDK 13 中,此类无操作安全点具有Cleanup操作名称。