1、安全点(safepoint)
程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才可以停顿
安全点的选择很重要,如果太少可能导致GC等待时间长,如果太多则会导致用户线程运行性能低。所以一般安全点会选取程序执行时间较长的指令时刻。比如选取方法调用,循环跳转和异常跳转。
(1)抢占式中断(目前没有虚拟机采用)
首先中断所以线程,如果还有线程不在安全点,就恢复线程,让线程跑到安全点
(2)主动式中断
设置一个中断标识,各个线程运行到安全点的时候主动轮询这个标识,如果出现中断标识为真,则将自己进行中断挂起。
2、安全区域
如果线程处于sleep状态或者阻塞状态,这是线程无法响应jvm的中断请求,即无法到安全点主动挂起。此时就需要安全区域来解决。
安全区域是指在一段代码中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。
当程序运行到安全区域的代码时,首先标识已经进入安全区域,如果这段时间发生GC,jvm会忽略标识为安全区域的线程。
当线程离开安全区域时,会检测jvm释放已经完成GC,如果完成,则继续运行,否则线程必须等待直到收到可以离开安全区域的信号为止。