GC 安全点(Safepoint)¶
一、GC 什么时候可以执行¶
不是任何时候都能 GC。GC 需要所有线程停在安全点。
二、为什么需要安全点¶
对象状态可能不一致(比如正在改对象头),此时 GC 会出问题。安全点是"对象状态一致"的位置。
三、安全点位置¶
- 方法调用。
- 循环跳转。
- 异常返回。
- 到达安全点时线程可以被安全挂起。
四、怎么让线程到安全点¶
- 主动式:轮询。线程在指令里插安全点,发现需要 GC 就主动停。
- 抢先式:JVM 现在不用。
五、Safepoint 日志¶
六、安全点不够的问题¶
- 长循环没有安全点,GC 等待时间长。
- JVM 启动慢,安全点计数多。
七、安全区域¶
线程在 native 方法里,没法到安全点。安全区域覆盖这种情况:整个区域内对象不会变,可以 GC。
面试要点
GC 不是随时能开始,要等所有线程到安全点。这就是为什么 GC 有时延迟。