小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
根据可达性算法的分析可知,如果要找出存活对象,需要从 GC Roots 开始遍历,然后搜索每个对象是否可达,如果对象可达则为存活对象,在 GC Roots 的搜索过程中,按照对象和其引用是否被访问过这个条件会分成下面三种颜色:
- 白色:白色表示 GC Roots 的遍历过程中没有被访问过的对象,出现白色显然在可达性分析刚刚开始的阶段,这个时候所有对象都是白色的,如果在分析结束的阶段,仍然是白色的对象,那么代表不可达,可以进行回收。
- 灰色:对象已经被标记锅,但是这个对象的引用还没有被标记。
- 黑色:对象本身和对象的引用都被标记过。
可能出现的问题:
产生漏标问题的条件有两个: 1.黑色对象指向了白色对象 2.灰色对象指向白色对象的引用消失
- 跟踪黑指向白的增加 incremental update:增量更新,关注引用的增加,把黑色重新标记为灰色,下次重新扫描属性。CMS采用该方法。
- 记录灰指向白的消失 SATB snapshot at the beginning:关注引用的删除,当灰-->白消失时,要把这个 引用 推到GC的堆栈,保证白还能被GC扫描到。G1采用该方法。