垃圾收集器底层算法之三色标记

JVM中的垃圾回收算法有很多种,其中三色标记算法(Tri-colorMarkingAlgorithm)是一种非常常用的垃圾回收算法,也是现代JVM中垃圾回收器的基础算法之一。

三色标记算法将内存中的对象划分为三类:白色对象、黑色对象和灰色对象。
  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍。黑色对象不可能直接(不经过灰色对象)指向某个白色对象。
  • 灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过。
  • 白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。
三色标记算法的基本流程如下:
  1. 初始化所有对象为白色对象;
  2. 从根对象开始遍历整个对象图,将所有可达对象标记为灰色对象;
  3. 从灰色对象集合中取出一个对象,将其标记为黑色对象,并将它所有引用的对象加入灰色对象集合中;
  4. 重复步骤3,直到灰色对象集合为空;
  5. 将所有未标记为黑色对象的白色对象进行回收。

在三色标记算法中,灰色对象集合可以用一个队列来实现。JVM中的垃圾回收器会定期启动垃圾回收线程来执行三色标记算法,并且尽量保证垃圾回收的停顿时间较短。

三色标记算法的优点是可以准确地判断出所有可达对象,并且能够避免误判问题。缺点是需要耗费一定的时间进行扫描和标记,并且在标记阶段需要暂停应用程序的执行,可能会引起一定的性能问题。

在并发标记的过程中,多标和漏标的情况就有可能发生。

原因

这是由于CMS采用的是“标记-清除”算法,其中清除阶段会与应用程序并发运行。在标记阶段,CMS需要在多线程下标记所有的存活对象,这一过程称为并发标记。在这个过程中,应用程序线程仍在运行,并在不断地产生新的对象。因此,CMS可能会遗漏一些存活对象,导致漏标记。同时,由于对象图中存在环状结构,CMS可能会多次扫描同一个对象,导致多标记。

多标记的原因是由于在标记过程中,CMS需要对跨代引用(即从年轻代指向老年代的引用)进行处理,但由于对象的移动或对象引用发生变化等原因,CMS可能会在多次扫描对象图时重复标记同一对象。这样一来,某些对象可能会被标记多次,这就是多标记的情况。

漏标记的原因则是由于CMS需要在应用程序继续运行的情况下标记对象,但应用程序可能会在标记期间不断地创建新的对象,这些新的对象可能会被遗漏,导致漏标记。例如,在并发标记期间,一个对象已经被标记为存活对象,但由于它的引用已经被修改,导致它被误认为是垃圾对象,从而被回收掉。这就是漏标记的情况。

漏标会导致被引用的对象被当成垃圾误删除,这是严重bug,必须解决,有两种解决方案:增量更新(IncrementalUpdate)和原始快照(SnapshotAtTheBeginning,SATB)。

增量更新就是当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后,它就变回灰色对象了。

原始快照就是当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容