唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

Java 安全点技术

进入安全点时java线程可能存在不同的状态,这里需要处理所有的可能情况:

  • (1)处于解释执行字节码的状态中,解释器在通过字节码派发表(dispatch table)获取到下一条字节码的时候会主动检查安全点的状态;

  • (2)处于执行native代码的状态,也就是执行JNI,此时,VMThread不会等待线程进入安全点,执行JNI退出后线程需要主动检查安全点状态,如果此时安全点位置被标记了,那么就不能继续执行,需要等待安全点位置被清除后才能继续执行;

  • (3)处于编译代码执行中,那么编译器会在合适的位置(比如循环、方法调用等)插入读取全局Safepoint Polling内存页的指令,如果此时安全点位置被标记了,那么Safepoint Polling内存页会变成不可读,此时线程会因为读取了不可读的内存也而陷入内核,事先注册好的信号处理程序就会处理这个信号并让线程进入安全点。

  • (4)线程本身处于blocked状态,比如线程在等待锁,那么线程的阻塞状态将不会结束直到安全点标志被清除掉;

  • (5)当线程处于(1)/(2)/(3)三种状态的切换中,那么切换前会先检查安全点的状态,如果此时要求进入安全点,那么切换将不被允许,需要等待直到安全点状态清除;