GC 安全点和安全区域的区别

74 阅读2分钟

核心区别:安全点(Safepoint)是线程主动暂停的离散时间点;安全区域(Safe Region)是线程被动暂停时(如阻塞)所处的一段代码区域,该区域内线程状态不会改变,无需主动响应GC暂停请求。

1. 安全点(Safepoint)

  • 定义:程序执行过程中某些特定的“时间点”,线程在此刻的状态是稳定的(如不会执行对象分配、引用关系变更等操作),GC可以安全地进行内存回收。

  • 核心特点:

    主动触发:线程执行时会“主动检查”是否需要进入GC(如通过轮询标志),若需要则在最近的安全点暂停。

    离散分布:安全点不是代码里的每一行,而是分布在特定位置,例如:

      方法调用、返回时
      循环结束、分支跳转(如if-elsefor)
      异常抛出时
    
  • 场景:适用于线程处于运行状态时,确保GC能让所有运行线程在可控时间内暂停。

2. 安全区域(Safe Region)

  • 定义:一段“代码区域”,线程在该区域内执行时,其引用关系不会发生任何变化(即线程状态完全稳定),即使GC触发,线程也无需暂停(因为本身已处于安全状态)。

  • 核心特点:

    被动覆盖:线程因某种原因(如等待锁、休眠、I/O阻塞)进入非运行状态时,会先标记自己进入“安全区域”,此时GC无需管它;线程恢复运行前,会先检查GC是否已结束,若未结束则等待GC完成。

    连续区域:是一段连续的代码段,而非离散的时间点。

  • 场景:解决线程处于阻塞/休眠状态(无法主动响应安全点检查)时的GC安全问题,避免GC等待这些“无响应”线程。

总结

安全点是“运行中线程主动停在特定时间点”,安全区域是“阻塞线程被动处于安全代码段”,二者共同确保GC时所有线程都处于可安全回收的状态。