Safepoint 是 JVM 中线程可安全暂停的特定位置,用于保障 GC 可达性分析等 STW 操作的准确性,并支撑类重定义、偏向锁撤销、反优化及线程诊断等运行时服务,通过协作式轮询机制实现,避免强制中断。
Java 虚拟机中的 Safepoint 是线程可以安全暂停的特定位置,核心作用是让 JVM 在需要全局一致状态时,可靠、可控地执行关键操作,而不是粗暴中断线程
。
垃圾回收(尤其是可达性分析)必须确保对象图不被应用线程(mutator)并发修改。Safepoint 提供了“所有线程都停在已知、稳定状态”的窗口:栈帧结构清晰、寄存器和堆中引用关系确定、没有中间态数据。只有这时,GC 才能准确标记存活对象,避免误回收或漏回收。
不只是 GC,任何需全线程协同的底层操作都依赖 Safepoint:
JVM 不直接 kill 或 suspend 线程,而是靠“插点+轮询”机制达成协作:
Safepoint 本身透明,但不当代码可能延长进入时间,导致 STW 延迟升高:
while(true) { /* 纯计算 */ })会卡住线程,无法及时响应 GC 请求Thread.yield() 或轻量方法调用(如 System.nanoTime()),触发 polling-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 查看各线程停顿分布和最长延迟基本上就这些。