本文目录#
什么是 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
/End
,VM Operation
。
常见 Safepoint 操作#
VM Operation | 描述 | 可能原因 |
---|---|---|
BulkRevokeBias |
撤销偏向锁 | 锁竞争激增、偏向锁失效 |
RevokeBias |
撤销单个偏向锁 | 多线程访问偏向对象 |
DeoptimizeFrame |
JIT 反优化 | 断言失败、类重新定义 |
GenCollectForAllocation |
GC | 新对象分配失败 |
EnableBiasedLocking |
启用偏向锁 | 启动阶段 |
优化策略#
- 偏向锁撤销频繁:在竞争激烈的类上禁用偏向锁(
-XX:BiasedLockingStartupDelay=0
、-XX:-UseBiasedLocking
)。 - 类重定义:避免频繁动态生成类或使用
-XX:+TraceClassLoading
定位。 - GC 相关:优化堆布局、降低分配速率。
- 监控:结合 JFR 统计 safepoint 总时间,判断是否达 SLA。
自检清单#
- 是否启用了 safepoint 日志并定期检查?
- 是否分析 VM Operation 类型并制定对应优化?
- 是否将 safepoint 耗时纳入性能测试指标?
参考资料#
- HotSpot Safepoint 文档:https://wiki.openjdk.org/display/HotSpot/Safepointing
- Unified Logging - safepoint:https://docs.oracle.com/en/java/javase/17/gctuning/garbage-collector-logging.html
- JEP 312: Thread-Local Handshakes:https://openjdk.org/jeps/312
本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。