安全点和安全区域是jvm实现可控暂停的核心机制,安全点通过在方法返回、循环跳转等位置插入轮询检查点使java线程主动暂停,安全区域则覆盖jni调用、阻塞等无法轮询的盲区,二者协同确保stw快速、安全完成。

安全点和安全区域是 JVM 实现“可控暂停”的核心机制,它们共同确保 GC 或其他全局操作(如偏向锁撤销、线程 dump)能在不破坏程序语义的前提下,安全、高效地完成 Stop-The-World(STW)。
安全点:让线程主动停在可预测的位置
安全点不是任意指令位置,而是 JIT 编译器在方法返回前、循环跳转处、异常抛出处等“长时间执行特征明显”的地方插入的检查点。线程运行到这些位置时,会主动轮询一个全局标志位;一旦发现 GC 已触发,就立即挂起自己。
- 避免 STW 等待过久:若没有安全点,JVM 可能要等某条长循环执行完才能暂停,导致 GC 延迟飙升
- 支撑 OopMap 快速定位 GC Roots:只在安全点记录栈帧中对象引用的位置,节省大量内存空间
- 不止用于 GC:类卸载、JIT 去优化、线程栈快照等也依赖它统一暂停所有 Java 线程
安全区域:覆盖无法响应轮询的“盲区”
当线程正在执行本地方法(JNI)、处于阻塞状态(如 wait、sleep、IO 等待),或刚进入 native 代码时,它无法及时检测安全点轮询标志——这类状态被 JVM 视为“已进入安全区域”。
- 进入时标记:线程一进入 JNI 调用或阻塞态,JVM 就将其标记为“在安全区域内”
- 退出时校验:线程从 native 返回或唤醒后,需先到达下一个安全点再继续执行,确保状态一致
- 解决“不可达”问题:防止 GC 因个别线程长期卡在 native 中而无限等待
两者协同降低 STW 不确定性
安全点负责活跃 Java 线程的协作式暂停,安全区域则兜底处理那些暂时脱离 JVM 控制的线程。它们配合使用,使 JVM 能在毫秒级内收敛全部线程到一致状态,既保障内存模型正确性,又避免因单一线程拖慢全局停顿。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











