JVM为什么需要Stop-The-World?
上一篇Java虚拟机面试准备(二)垃圾收集算法和垃圾收集器中介绍了判断对象是否存活需要进行可达性分析,此时可能其它进程已经更新对象的引用,那么可能出现误报和漏报,误报问题不大,可以进行下一次回收,漏报则是漏了可达对象,造成将非垃圾对象标注了垃圾,可能是虚拟机崩溃.所以为了避免漏报,需要STOP THE WORLD.
何时 STOP THE WORLD ?
STOP THE WORLD是通过safepoint机制来实现的,当JVM收到STOP THE WORLD请求时,JVM开始进行safepoint检查,当到达safepoint时开始挂起线程.JVM会等待所有线程到达safepoint,此时就完成STOP THE WORLD.GC线程开始可达性分析操作.
那什么是safepoint?
safepoint是指执行一段字节码,Java虚拟机 堆栈状态不会发生变化的稳定状态的一个点.
对解释执行,JVM每执行一次就执行一次safepoint检测,字节码之间皆可作为安全点.
对编译执行,会在编译成机器码时插入safepoint.会在所有方法的返回之前,以及所有非counted loop的循环(无界循环)回跳之前放置一个safepoint.具体参考JVM源码分析之安全点safepoint.