本文目录#

什么是 Safepoint#

Safepoint 是 JVM 为执行特定操作(GC、栈遍历、偏向锁撤销、deoptimization)而暂停所有线程的点。频繁或长时间的 Safepoint 会导致延迟问题。

诊断方法#

  • JDK 8-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+LogVMOutput -XX:LogFile=safepoint.log
  • JDK 9+-Xlog:safepoint*,safepoint+stats=debug:file=safepoint.log
  • JFR 事件:Safepoint Begin / EndVM Operation

常见 Safepoint 操作#

VM Operation 描述 可能原因
BulkRevokeBias 撤销偏向锁 锁竞争激增、偏向锁失效
RevokeBias 撤销单个偏向锁 多线程访问偏向对象
DeoptimizeFrame JIT 反优化 断言失败、类重新定义
GenCollectForAllocation GC 新对象分配失败
EnableBiasedLocking 启用偏向锁 启动阶段

优化策略#

  1. 偏向锁撤销频繁:在竞争激烈的类上禁用偏向锁(-XX:BiasedLockingStartupDelay=0-XX:-UseBiasedLocking)。
  2. 类重定义:避免频繁动态生成类或使用 -XX:+TraceClassLoading 定位。
  3. GC 相关:优化堆布局、降低分配速率。
  4. 监控:结合 JFR 统计 safepoint 总时间,判断是否达 SLA。

自检清单#

  • 是否启用了 safepoint 日志并定期检查?
  • 是否分析 VM Operation 类型并制定对应优化?
  • 是否将 safepoint 耗时纳入性能测试指标?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。