深入浅出解析JVM中的Safepoint
记一次Safepoint导致长时间STW
带你彻底了解JVM SafePoint
一、 safepoint的工作原理
-
触发 safepoint:当虚拟机需要执行某些全局操作(例如垃圾回收、类重新定义、编译优化等)时,会发起一个 safepoint 请求。这个请求通常通过设置一个全局标志来通知所有活动线程。
-
线程响应:每个线程在执行过程中会根据一定的规则,插入safepoint检查点。在遇到 safepoint 检查点(通常位于方法调用、循环边界等安全的位置)时,如果检测到有 safepoint 请求,线程会暂停执行并报告已到达 safepoint。
-
执行 safepoint 操作:一旦所有线程都到达 safepoint,虚拟机就会执行需要在安全点进行的操作,如垃圾回收、类的重定义。这些操作需要确保所有线程的状态一致,以避免数据竞争和不一致的问题。
-
恢复执行:操作完成后,虚拟机会通知所有线程恢复执行,从 safepoint 之后的位置继续运行程序。
二、什么时候会请求进入safepoint
-
垃圾回收(Garbage Collection):当JVM需要进行垃圾回收时,会请求所有线程到达 safepoint,以确保在回收过程中没有线程在修改对象,从而避免内存不一致的问题。
-
类的重新定义和加载:在运行时动态地重新定义类(例如使用
java.lang.instrument工具)或加载新类时,JVM需要确保所有相关线程处于安全点,以正确更新类的元数据。 -
偏向锁的撤销:高并发场景,在撤销线程偏向锁(Biased Lock)时,为了确保锁状态的一致性,JVM会进入 safepoint 以安全地修改锁的信息。
-
线程堆栈转储:当执行stack,jmap 和 jstat 等命令,生成线程栈转储信息时,JVM需要所有线程在 safepoint 处于可暂停状态,以准确记录每个线程的栈帧信息。
-
定时进入 SafePoint:每经过-XX:GuaranteedSafepointInterval 配置的时间,都会让所有线程进入 Safepoint
三、线程如何响应safepoint
在方法调用或循环的边界时,进行一次 safepoint 检查;或者配置了-XX:GuaranteedSafepointInterval参数,定时执行 safepoint 检查;或者执行 native 代码、线程状态切换等等;
500

被折叠的 条评论
为什么被折叠?



