应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

一文带你弄懂JVM三色标记算法

  大家好
  最近和一个朋友聊天,他问了我JVM的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来干嘛的,以及它和CMS回收器和G1回收器的关系了。今天,就让树哥带着大家一起盘一盘它!
  根可达算法
  我们要进行垃圾回收,就需要弄明白哪些对象是需要回收的,哪些对象是不需要回收的。针对这个问题,其实业界已经有几种常见的解决方法了。
  第一种是计数法,就是每个对象都有一个计数器,被引用了加一,移除引用减一。但这种方法比较麻烦,而且也会有循环依赖的问题,因此并不被广泛使用。第二种是根可达算法,即以GCRoots为基础去扫描整个引用链,从而找到所有的可达对象,那剩下的其他对象就是不可达的垃圾对象了。现在被广泛使用的是第二种算法,即根可达算法。
  那怎么去实现根可达算法呢?最简单的一种实现方案是:从GCRoots节点开始,使用标记清除算法去实现。
  这种实现方案分为两个阶段,分别是:标记阶段、清除阶段。在标记阶段,它从GCRoots节点开始扫描整个引用链,找到所有可达的对象。在清除阶段,扫描整个引用链的不可达对象,然后将垃圾对象清除掉。整个算法实现过程如下图所示。
  但这种方式有一个很大的缺点:整个过程必须StoptheWorld。这就导致整个应用程序必须停止,不能做任何改变,这是非常不友好的。CMS回收器出现之前的所有回收器,都是用这种方式实现的,因此GC停顿时间都比轿长。三色标记算法
  为了解决上面标记清除算法的问题,于是就出现了三色标记算法!三色标记算法指的是将所有对象分为白色、黑色和灰色三种类型。黑色表示从GCRoots开始,已扫描过它全部引用的对象,灰色指的是扫描过对象本身,还没完全扫描过它全部引用的对象,白色指的是还没扫描过的对象。
  但仅仅将对象划分成三个颜色还不够,真正关键的是:实现根可达算法的时候,将整个过程拆分成了初始标记、并发标记、重新标记、并发清除四个阶段。初始标记阶段,指的是标记GCRoots直接引用的节点,将它们标记为灰色,这个阶段需要StoptheWorld。并发标记阶段,指的是从灰色节点开始,去扫描整个引用链,然后将它们标记为黑色,这个阶段不需要StoptheWorld。重新标记阶段,指的是去校正并发标记阶段的错误,这个阶段需要StoptheWorld。并发清除,指的是将已经确定为垃圾的对象清除掉,这个阶段不需要StoptheWorld。
  对比一下四阶段拆分和一段式的实现方式,我们可以看出:通过将最耗时的引用链扫描剥离出来作为并发标记阶段,将其与用户线程并发执行,从而极大地降低了GC停顿时间。但GC线程与用户线程并发执行,会带来新的问题:对象引用关系可能会发生变化,有可能发生多标和漏标问题。多标与漏标问题
  多标问题指的是原本应该回收的对象,被多余地标记为黑色存活对象,从而导致该垃圾对象没有被回收。多标问题会出现,是因为在并发标记阶段,有可能之前已经被标记为存活的对象,其引用被删除,从而变成了不可达对象。例如下图中,假设我们现在遍历到了节点E,此时应用执行了objD。fieldEnull;。那么此刻之后,对象E、F、G应该是被回收的。但因为节点E已经是灰色的,那么E、F、G节点都会被标记为存活的黑色状态,并不会被回收。
  多标问题会导致内存产生浮动垃圾,但好在其可以再下次GC的时候被回收,因此问题还不算很严重。
  漏标问题指的是原本应该被标记为存活的对象,被遗漏标记为黑色,从而导致该垃圾对象被错误回收。例如下图中,假设我们现在遍历到了节点E,此时应用执行如下代码。这时候因为E对象没有引用了G对象,因此扫描E对象的时候并不会将G对象标记为黑色存活状态。但由于用户线程的D对象引用了G对象,这时候G对象应该是存活的,应该标记为黑色。但由于D对象已经被扫描过了,不会再次扫描,因此G对象就被漏标了。varGobjE。fieldG;objE。fieldGnull;灰色E断开引用白色GobjD。fieldGG;黑色D引用白色G
  漏标问题就非常严重了,其会导致存活对象被回收,会严重影响程序功能。
  那么我们的垃圾回收器是怎么解决这个问题的呢?
  答案是:增加一个重新标记阶段。无论是在CMS回收器还是G1回收器,它们都在并发标记阶段之后,新增了一个重新标记阶段来校正并发标记阶段出现的问题。只是对于CMS回收器和G1回收器来说,它们解决的原理不同罢了。漏标解决方案
  正如前面所说,三色标记算法会造成漏标和多标问题。但多标问题相对不是那么严重,而漏标问题才是最严重的。我们经过分析可以知道,漏标问题要发生需要满足如下两个充要条件:有至少一个黑色对象在自己被标记之后指向了这个白色对象所有的灰色对象在自己引用扫描完成之前删除了对白色对象的引用
  只有当上面两个条件都满足,三色标记算法才会发生漏标的问题。换言之,如果我们破坏任何一个条件,这个白色对象就不会被漏标。这其实就产生了两种方式,分别是:增量更新、原始快照。CMS回收器使用的增量更新方案,G1采用的是原始快照方案。CMS解决方案CMS回收器采用的是增量更新方案,即破坏第一个条件:有至少一个黑色对象在自己被标记之后指向了这个白色对象。
  既然有黑色对象在自己标记后,又重新指向了白色对象。那么我就把这个黑色对象的引用记录下来,在后续重新标记阶段再以这个黑色对象为跟,对其引用进行重新扫描。通过这种方式,被黑色对象引用的白色对象就会变成灰色,从而变为存活状态。
  这种方式有个缺点,就是会重新扫描新增的这部分黑色对象,会浪费多一些时间。但是这段时间相对于并发标记整个链路的扫描,还是小巫见大巫,毕竟真正发生引用变化的黑色对象是比较少的。G1解决方案G1回收器采用的是原始快照的方案,即破坏第二个条件:所有的灰色对象在自己引用扫描完成之前删除了对白色对象的引用。
  既然灰色对象在扫描完成后删除了对白色对象的引用,那么我是否能在灰色对象取消引用之前,先将灰色对象引用的白色对象记录下来。随后在重新标记阶段再以白色对象为根,对它的引用进行扫描,从而避免了漏标的问题。通过这种方式,原本漏标的对象就会被重新扫描变成灰色,从而变为存活状态。
  这种方式有个缺点,就是会产生浮动垃圾。因为当用户线程取消引用的时候,有可能是真的取消引用,对应的对象是真的要回收掉的。这时候我们通过这种方式,就会把本该回收的对象又复活了,从而导致出现浮动垃圾。但相对于本该存活的对象被回收,这个代码还是可以接受的,毕竟在下次GC的时候就可以回收了。
  对于CMS和G1这两种处理方案哪种更好,很多资料说的是G1这种解决方案更好。原因是其觉得G1这种方式产生了一些浮动垃圾,但节省了一些时间。但我对比了一下发现:CMS和G1都需要重新对某些元素进行引用链扫描。从这点看来,好像差别不大。有弄懂的朋友可以评论区留言讨论讨论。总结
  看完了整篇文章,我们试图来回答一些问题。
  三色标记算法是什么?三色标记算法是根可达算法的一种实现方案,其目的是为了找出所有可达对象。
  为什么要有三色标记算法?因为传统的标记清除算法效率太低,于是采用三色标记算法通过将对象分成白色、黑色、灰色,以及将整个过程拆分成初始标记、并发标记、重新标记、并发清除4个过程,从而降低GC停顿时间。
  三色标记算法有什么缺陷?三色标记算法会产生多标和漏标问题,其中漏标问题最严重。漏标问题会导致本该存活的对象被回收,从而导致严重的程序问题。
  漏标有什么解决方案?漏标有两种解决方案,分别是:增量更新和原始快照方式。CMS回收器采用了增量更新方式,G1回收器采用了原始快照方式。
  漏标哪种解决方案最好?江湖传闻G1回收器的原始快照方式效率高,但没有确切的理论证明,且听且珍惜。

雪龙吟与天地龙鳞谁更胜一筹最近冬奥会的热度是非常的高,同时也带火了一首歌曲《雪龙令》,然而有不少网友也会拿它跟另一首歌曲《天地龙鳞》来作比较。今天我们就来欣赏一下这两首歌曲,又有什么异曲同工之处呢……火箭雷霆酝酿2换1交易!杰伦格林亚历山大牵涉其中?雷霆队去年夏天想要用球队核心吉尔吉斯。亚历山大换取火箭队的榜眼签,结果火箭队总经理拉斐尔。斯通拒绝了这份交易报价。亚历山大本赛季场均出战34。6分钟,得到22。7分4。7篮板5……萨拉赫孙兴慜凯恩,谁会是这个夏天加盟皇马的下一位巨星?在之前一篇文章中,宝哥已经分析过,虽然皇马已经在今夏转会市场上签下了吕迪格和楚阿梅尼两名实力派球星,但由于贝尔的离队,以及阿森西奥、约维奇、马里亚诺都可能离队,再加上阿扎尔的状……第一次自驾旅游有没有和我一样,借着散心为借口,和喜欢的人一起出去玩。现在有了自己的车就是好,不会像以前一样,只能坐高铁出行,现在有了自己的车,可以自驾旅游了。感觉跟团出去玩太累了,自己开车,……签了!勇士冠军中锋加盟CBA!曾经跟科尔争吵,真是个刺头啊据北青报记者宋翔报道,广州男篮已经与前勇士球员乔丹贝尔签约。等手续完成后,贝尔会尽快来广州队报到。乔丹贝尔出生于1995年1月7日,今年27岁,正值当打之年。他身高2米06,可……二手服装堆积如山,不受欢迎的ampampquot快时尚amp近日,几张非洲海滩的照片在网上引起了关注。照片上,大量服装被海水冲到了岸上。堆积成山的服装被冲上岸这个海滩位于加纳首都阿克拉,大量湿透的衣服散落在沙滩上。这些……麦迪在NBA历史上,仅有俩人真正统治过联盟,阿摊还相差甚远麦迪觉得,不管怎么看,截止到目前,NBA里面只有两个人真正统治过联盟,分别是乔丹和奥尼尔。毕竟在NBA历史上,只有这二位带队夺得三连冠且自己都拿到了fmvp。就是由于如此,于是……伊藤美诚心态崩!国乒群龙逐鹿樊振东豪取3冠,孙颖莎满电营业中国国乒结束漫长的征程,回到山东威海训练基地,还是21天的隔离观察!令人感动的是,前国乒第二代大魔王、大满贯得主王楠与其丈夫,出钱出力,负责国乒教练组、国乒球员、国乒后勤……预算1000块钱左右,想买个二手机玩游戏,我来给你推荐一款之前我的粉丝提醒我,让我可以做一期关于二手手机的推荐,之前我也在抖音上面看过,就是很多学生党都想在1000块钱左右买一款二手手机打游戏,那么今天我就给大家带来一款OPPORen……研究恒星和系外行星的潘多拉任务通过了关键的里程碑由劳伦斯利弗莫尔国家实验室和美国宇航局飞行中心共同领导的潘多拉任务,在研究太阳系以外的恒星和行星,即系外行星的道路上,已经通过了关键的一步。在成功的概念研究报告和系统要求审查之……狠批毛不易,被称华语乐坛领军唱作人,华晨宇的资格从哪来?01hr你通过《泡沫》认识了邓紫棋。通过《消愁》认识了毛不易。又通过《大鱼》认识了周深。哪怕是曾经被嘲顶流的鹿晗、蔡徐坤。现在提起他们,我们也能说出《勋……阿布扎比世界上最富有城市,酒店垃圾桶镀金,咖啡蛋糕上放金箔说起阿联酋,大家首先想到的是迪拜,迪拜的帆船酒店,哈利法塔,棕榈岛等知名建筑,还有豪到掉渣的迪拜王室,个个手托鹰隼,出门为开那辆跑车而发愁。其实比迪拜更豪的是阿布扎比,那……
官方加迪斯要求废除与埃尔切赛果,并从第81分钟重赛虎扑01月18日讯今天凌晨加迪斯官方发表声明,就在本周日的与埃尔切的联赛中的严重误判向西班牙足协竞赛委员会提出申诉,要求废除本场比赛的赛果,并且从比赛第81分钟,也就是埃尔切的……定了!今年我国将发射三船六人,还有首次公开征集据中国载人航天工程办公室消息,我国将于今年发射天舟六号货运飞船、神舟十六号载人飞船、神舟十七号载人飞船,这是中国空间站全面建成转入应用与发展新阶段后的首批飞行任务。按照飞……生活养成好习惯消除眼袋吧1、冰敷。将干净柔软的面巾浸入冰水中,然后拧干多余水分。轻轻压在眼睛底下和周围部位,确保覆盖整个眼袋。敷5分钟。利用冰凉触感的方法能收缩血管,缓解眼底皮肤变色和肿胀。……它做餐饮外卖,一天只一个菜品,日售13万份,年收入90亿日元它每天只卖一种便当它600人一天要卖掉13万份便当它是唯一回收饭盒的外卖公司它从不融资、不打广告、不做销售它就是日本的外卖大王,它年入90亿日元0……自然杂志150年间撤稿86篇超半数来自美国近日,美国行为生态学家JonathanPruitt于2014年10月1日发表在《自然》的文章因数据不可靠被撤稿,成为《自然》今年撤销的第一篇论文。不过,Pruitt不同意这篇关……外媒报告声称中国黑客入侵中东电信供应商?中东的电信提供商是2023年第一季度开始的新网络攻击的目标。该入侵集被归因于一名中国网络间谍行为者,该行为者与一项基于工具重叠的名为OperationSoftCell的长期活动……全新的iPhone15系列被曝光,iPhone14前辈机皇跌据知名分析师郭明錤最新发布的信息显示,与此前曝光的消息基本一致,全新的iPhone15系列已经基本确认将全系采用灵动岛显示屏,不过与前作iPhone14Pro的有一定的区别,比……感恩的力量会让你扭转逆境感恩的力量会让你扭转逆境人生中不可避免地会遭遇困难和逆境,这些挫折对我们的心理健康和生活状态都会造成不可忽略的影响。如果我们能够学会感恩,认识到生命中的美好和值得珍惜的东……重磅!媒体人疑暗示中国足协纪律委员会主任王小平被查就在3月21日下午,中国足球界著名媒体人徐江故事会在社交媒体发布了三张照片,第一张是一张大王扑克牌,第二张为一个苹果,第三张为当时国足40强赛出线后陈戌源跳舞的照片,前面两张很……以太坊比特币网络内的不同链上趋势增加了ETHBTC继续下跌的比特币(BTC)是世界上第一个也是市值最大的加密货币,而以太坊(ETH)是世界上市值第二大的加密货币,为以太坊区块链提供支持,其汇率在最近几周迅速下跌。ETHBTC最后一……国内的P2P金融诈骗和缅甸的电信诈骗是一个套路说到缅甸的电信诈骗,在如今的中国可以说是家喻户晓了,同时前几年国内的P2P,所谓的互联网金融再创新模式,也早就成为了一地鸡毛,现在为啥老百姓不愿意再理财和投资了,千方百计把钱放……索要4年1亿!仅40命中率,球队有意将他交易,1000万都不篮网送走了三位巨头,这下彻底安稳了,战绩从东部前三下滑到第六,不出意外的话要下滑到附加赛区,但是接下来的比赛篮网还不能松懈,还剩下7场比赛,至少要赢下4场比赛,否则季后赛的希望……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网