安全点就是指代码种的一些特定位置,当线程运行到这些位置时它的状态是确定的,这样JVM就可以安全进行一些操作,比如GC等,所以GC不是想什么时候执行就立即触发,是需要等待所有线程运行到安全点后才能触发。
这些特定的安全点位置主要有以下几种:
- 方法返回之前
- 调用某个方法之后
- 抛出异常的位置
- 循环的末尾
大体实现思想就是当垃圾收集需要中断线程的时候,不直接对线程操作,仅仅简单的设置一个标志位,各个线程执行过程会不停的主动去轮询这个标志,一旦发现中断标志为真时就自己在最近的安全点上主动中断挂起。轮询标志的地方和安全点是重合的。
以G1收集器回收过程为例,可以看出每次发生STW时,都是在安全点时真正触发。
安全区域又是什么?
Safe Point是对正在执行的线程设的。
如果一个线程处于Sleep或中断状态,它就不能响应JVM的中断请求,再运行到Safe Point上。
因此JVM引入了Safe Region
Safe Region是指一段代码片段中,引用关系不会发生变化。这个区域内的任意地方开始GC都是安全的。