跳转至

GC 安全点(Safepoint)

一、GC 什么时候可以执行

不是任何时候都能 GC。GC 需要所有线程停在安全点。

二、为什么需要安全点

对象状态可能不一致(比如正在改对象头),此时 GC 会出问题。安全点是"对象状态一致"的位置。

三、安全点位置

  • 方法调用。
  • 循环跳转。
  • 异常返回。
  • 到达安全点时线程可以被安全挂起。

四、怎么让线程到安全点

  • 主动式:轮询。线程在指令里插安全点,发现需要 GC 就主动停。
  • 抢先式:JVM 现在不用。

五、Safepoint 日志

Total time for which application threads were stopped: 0.0234567 seconds

六、安全点不够的问题

  • 长循环没有安全点,GC 等待时间长。
  • JVM 启动慢,安全点计数多。

七、安全区域

线程在 native 方法里,没法到安全点。安全区域覆盖这种情况:整个区域内对象不会变,可以 GC。

面试要点

GC 不是随时能开始,要等所有线程到安全点。这就是为什么 GC 有时延迟。