jvm-三色标记

jvm-三色标记

起男 1,061 2020-12-30

jvm-三色标记

gms、g1标记的时候一般用的是三色标记法,根据可达性分析从GC Roots开始进行遍历访问,可达的则为存活对象,而最终不可达说明就是需要被GC对象

大致流程是把遍历对象图过程中遇到的对象,按是否访问过这个条件标记成三种颜色:

  • 白色:尚未访问过
  • 黑色:本对象已经访问过,而且本对象引用到的其他对象,也全部访问过了
  • 灰色:本对象已经访问过,但是本对象用到的其他对象,尚未全部访问完。全部访问后会转换为黑色

假设现在有白、灰、黑三个集合(表示当前对象的颜色),遍历访问过程:

  1. 初始化所有对象都在白色集合中
  2. 将GC Roots直接引用到的对象挪到灰色集合中
  3. 从灰色集合中获取对象:
    1. 将本对象引用到的其他对象,全部挪到灰色集合中
    2. 将本对象挪到黑色集合里面
  4. 重复步骤3,直到灰色集合为空时结束
  5. 结束后仍在白色集合的对象即为GC Roots不可达,可以尝试进行回收

当stw时,对象间的引用是不会发生变化的,可以轻松完成标记。当支持并发标记时,对象间的引用可能发生变化,多标和漏标的情况就有可能发生

原文:https://mp.weixin.qq.com/s/GfAfffbF_uiphN0Zd3YouQ