java - Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作
问题描述
我正在使用-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 个线程促成了阻塞。
我不明白第二行,什么是“None” vmop 操作?看起来该操作的持续时间为 0。它真的是 0 还是 0 因为它花费了不到 1 毫秒?如果是,可以设置更高粒度的时间记录,看看花了多少纳秒?还是微秒?
我每秒记录许多这种“无”操作。我想知道 JVM 在暂停期间在做什么。我每 10 秒跟踪一次 ZGC 时间和 SafePoint 时间,聚合的安全点时间是聚合的 gc 暂停时间的 5 倍。我想以某种方式减少我的应用程序的安全点时间。
解决方案
这是一个没有 VM 操作的安全点。其目的是执行定期清理任务,如放空空闲监视器或清除内联缓存缓冲区,只有在没有 Java 线程运行时才能安全地完成这些任务。
如果有清理任务要做,则强制安全点每GuaranteedSafepointInterval
毫秒发生一次。默认值为 1000。请注意,在您的情况下,无操作安全点恰好在前一个安全点之后 1 秒发生。
间隔可以调整
-XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=<ms>
为避免混淆,在 JDK 13 中,此类无操作安全点获得了Cleanup
操作名称。
推荐阅读
- android - 在 Android 9.0 中无法接收 TYPE_NOTIFICATION_STATE_CHANGED 事件
- laravel - 从pdf中提取文本在Laravel中不起作用
- swift - 同时从 API 调用和模型文件中解码 Codable 结构
- typescript - 我可以从 TypeScript 访问转译的 ES5 代码中的私有成员
- angular - 使用第三方库中的类型在 .d.ts 文件中声明接口会导致编译错误
- npm - 如何修复“npm ERR!网络如果你在代理后面”
- python - 基于某些条件的颜色数据框
- azure - 当集合的 TTL 设置为 ON 时,无法通过 Azure 流分析作业更新 Cosmos DB 集合
- java - 每分钟向服务器发送数据(用于检查状态用户)
- linear-algebra - DolphinDB 中矩阵和向量的元素乘法