引用计数法,引用跟踪法,三色标记法

前言

简单整理下自己对各个GC算法的理解,做备忘用。

引用计数法

每个对象维护一个计数器,记录当前被引用的次数,当对象被引用时,计数器+1;引用失效时,计数器-1。当计数器归零时,对象被视为垃圾。

缺点

无法处理循环引用的问题,例如下种情况,当A,B,C互相引用之后,计数器无法归零,并导致内存泄漏。
image

引用跟踪法

从根对象(包括线程栈中的引用,静态字段,常量等等)出发,通过BFS或者DFS遍历标记所有找的到的引用关系,最后没有被标记的对象就被视作垃圾进行回收(例如下图的F,G,H)。
image

缺点

非并发GC算法,遍历的时间太长,导致过长的STW(Stop The World),卡顿感强烈,用户体验不佳。

引用跟踪法(并发)

同非并发算法一样,采用二色标记的方法进行回收,不同的是不用在GC的时候暂停所有的线程,而是并发执行。

缺点

浮动垃圾

这次GC本应该回收掉的对象,有可能没法正常回收掉,例如这次GC执行到了F停止了
image
然后我们的业务程序继续工作,我们设置了D.F = null,移除了D对F的引用,本来已经没有根对象直接或者间接引用到F了,但是由于我们之前已经遍历到F了,所以仍然会将F视作可达对象,本轮不予回收。
image

漏标

还可能会导致引用的对象丢失的问题,例如这次GC时执行到D和E,E没有任何引用,它会认为E已经遍历完了。
image
然后我们的业务程序进行工作,我们给E新增了一个引用关系,E.f = D.f,同时删除了D.f的引用
image
然后又到了我们的GC时间,这个时候就寄了,因为E已经被视作遍历完成,不会再去寻找它的引用关系,但D又断开了F的引用关系,导致F,G,H被视作垃圾进行回收。

三色标记法+写屏障

三色标记法弥补的引用跟踪法的不足,它将节点的回收状态分为三种,分别是:

  • 黑色(我这里用绿色演示):对象和对象成员变量都检查过了
  • 灰色:对象已检查过,但是对象成员变量还没有全部检查
  • 白色:对象和对象成员变量都没有检查

标记过程

  • 初始标记:遍历所有根对象,将根对象和直接引用的对象标记为灰色。在这个阶段中,垃圾回收器只会扫描被直接或间接引用的对象,而不会扫描整个堆。因此,初始标记阶段的时间比较短。(需要STW)
  • 并发标记:在这个过程中,垃圾回收器会从灰色对象开始遍历整个对象图,将被引用的对象标记为灰色,并将已经遍历过的对象标记为黑色。并发标记过程中,应用程序线程可能会修改对象图,因此垃圾回收器需要使用“写屏障”计数来保证并发标记的正确性。(不需要STW)
  • 重新标记:重新标记的主要过程是标记在并发阶段中被修改的对象以及未被遍历到的对象。在这个过程中,垃圾回收器会从灰色对象重新开始遍历对象图,将被引用的对象标记为灰色,并将已经遍历的对象标记为黑色。(需要STW)

在重新标记阶段结束之后,垃圾回收器会执行清除操作,将未被标记为可达对象(白色对象)的对象进行回收,从而释放内存空间。
以上三个标记阶段中,初始标记和重新标记是需要STW的,而并发标记是不需要STW的。其中最耗时的其实就是并发标记的这个阶段,因为这个阶段需要遍历整个对象树,而三色标记把这个阶段做到了和应用线程并发执行,大大降低了GC的停顿时长。

写屏障

写屏障是一种在对象引用被修改时,将其新的引用信息记录在特殊数据结构中的机制。在三色标记法中,写屏障技术被用于记录对象的标记状态。当应用程序线程修改了一个对象的引用时,写屏障会记录该对象的新标记状态。

漏标的问题发生,需要同时满足2个充要条件:

  1. 至少有一个黑色对象在自己被标记之后指向了这个白色对象
  2. 所有的灰色对象在自己引用扫描完成之前删除了对白色对象的引用

增量更新方案就是破坏了第一个条件,而原始快照方案就是破坏了第二个条件。

插入屏障(增量更新)

当黑色对象新增对白色对象的引用时,将该对象记录下来,扫描完后将这个对象变为灰色对象,在重新标记阶段重新扫描。
以我们上面漏标为例子,但新增E.f = D.f时候,我们会再次将E标记为灰色,全部GC扫描完成后,我们会对还是灰色的对象,比如E重新扫描,这样就能成功把F标记上了。
image

删除屏障(原始快照)

如果灰色对象在扫描完成前删除了对白色对象的引用,那么我们就在灰色对象取消引用之前,先将灰色对象引用的白色对象记录下来。
在后续「重新标记」阶段再以这些白色对象为根,对它的引用进行扫描,从而避免了漏标的问题。通过这种方式,原本漏标的对象就会被重新扫描变成灰色,从而变为存活状态。
但是这种放回寺可能会把本来真的要取消引用的对象给错误的复活了,从而产生浮动垃圾。但是就像前面说的,多标的问题是可以忽略的。

引用

[1] CMS和G1改用三色标记法,可达性分析到底做错了什么?
[2] DeepSeek

posted @ 2025-05-03 14:09  陈侠云  阅读(312)  评论(0)    收藏  举报
//雪花飘落效果