jvm-三色标记
gms、g1标记的时候一般用的是三色标记法
,根据可达性分析从GC Roots开始进行遍历访问,可达的则为存活对象,而最终不可达说明就是需要被GC对象
大致流程是把遍历对象图过程中遇到的对象,按是否访问过这个条件标记成三种颜色:
- 白色:尚未访问过
- 黑色:本对象已经访问过,而且本对象引用到的其他对象,也全部访问过了
- 灰色:本对象已经访问过,但是本对象用到的其他对象,尚未全部访问完。全部访问后会转换为黑色
假设现在有白、灰、黑三个集合(表示当前对象的颜色),遍历访问过程:
- 初始化所有对象都在白色集合中
- 将GC Roots直接引用到的对象挪到灰色集合中
- 从灰色集合中获取对象:
- 将本对象引用到的其他对象,全部挪到灰色集合中
- 将本对象挪到黑色集合里面
- 重复步骤3,直到灰色集合为空时结束
- 结束后仍在白色集合的对象即为GC Roots不可达,可以尝试进行回收
当stw时,对象间的引用是不会发生变化的,可以轻松完成标记。当支持并发标记时,对象间的引用可能发生变化,多标和漏标的情况就有可能发生