安全点:
在程序执行过程中发生fullGC时,虚拟机并不是立即将所有线程挂起开始进行fullGC。而是需要等待所有线程执行到某些特定的位置才可以进行fullGC,这些位置就称为安全点;
实现思想是当垃圾收集需要中断线程的时候,不直接对线程操作,仅仅设置一个标志位, 各个线程执行过程 时会不停地主动去轮询这个标志, 一旦发现中断标志为真时就自己在最近的安全点上主动中断挂起。
轮询标志的地方和安全点是重合的。
这些特定的安全点位置主要有以下几种:
1. 方法返回之前
2. 调用某个方法之后
3. 抛出异常的位置
4. 循环的末尾
安全区域:
Safe Region如上图的BC段,该代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的。这样的区域称为安全区域。
如:
一个线程处于 Sleep 或中断状态,因为它不能响应 JVM 的中断请求,再运行到 Safe Point 上。