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

现在已经卷到需要问三色标记了吗?

  曾经,我以为这些东西自己平时看看书就够了,属于那种花了半天精力总算搞明白了,然后过两天就自然忘记的东西。
  结果,这都啥啊,啥是卡表,什么又是三色标记法,这些鬼问题都有人面试问,卷就完了。引用计数可达性分析
  要进行垃圾回收GC,那么我们首先就要决定到底怎么判断对象是否存活?一般来说有两种方式。
  引用计数,给对象添加一个计数器,每当有地方引用它计数器就1,反之引用失效时就1,那么计数器值为0的对象就是可以回收的对象,但是有一个问题就是循环引用的话无法解决。
  对于现在的虚拟机来说,主要用的算法是可达性分析算法。
  首先定义GCROOTS根对象集合,通过GCROOTS向下搜索,搜索的过程走过的路径称作引用链,如果某个对象到GCROOTS没有任何引用链,那么就是对象不可达,是可以被回收的对象。
  不可达对象需要进行两次标记,第一次发现没有引用链相连,会被第一次标记,如果需要执行finalize()方法,之后这个对象会被放进队列中等待执行finalize(),如果在finalize()中成功和引用链上的其他对象关联,就会被移出可回收对象集合。(但是不建议使用finalize()方法)
  分代收集
  有了如何判断对象存活的基础,接下来的问题就是怎么进行垃圾收集GC,现在商用的虚拟机基本上都是分代收集的实现,它的实现建立于两个假说:绝大多数对象都是朝生夕死的熬过越多次垃圾回收的对象越难死亡
  基于这两个假说,就产生了现在我们常见的年轻代和老年代。
  因为分代了,所以GC也就分代了。
  年轻代用于存放那些死的快的对象,年轻代GC我们称之为MinorGC,每次年轻代内存不够我们就触发MinorGC,以后还有存活的对象我们就根据经历过MinorGC次数和动态年龄判断来决定是否晋升老年代。
  老年代则存放老不死的对象,这里GC称之为OldGC,现在也有很多人把他叫做FullGC,实际上这并不准确,FullGC应该泛指年轻代和老年代的的GC。
  按照我们上文所说的使用可达性分析算法来判断对象的存活,那么假如我们进行MinorGC,会不会有对象被老年代引用着?进行OldGC会不会又有对象被年轻代引用着?
  如果是的话,那我们进行MinorGC的时候不光要管GCRoots,还有再去遍历老年代,这个性能问题就很大了。
  因此,又来了一个假说
  跨代引用相对于同代引用来说仅占极少数。
  由此就产生了一个新的解决方案,我们不用去扫描整个老年代了,只要在年轻代建立一个数据结构,叫做记忆集RememberedSet,他把老年代划分为N个区域,标志出哪个区域会存在跨代引用。
  以后在进行MinorGC的时候,只要把这些包含了跨代引用的内存区域加入GCRoots一起扫描就行了。
  卡表
  说完这些,才到了第一个话题:卡表。
  卡表实际上就是记忆集的一种实现方式,如果说记忆集是接口的话,那么卡表就是他的实现类。
  对于HotSpot虚拟机来说,卡表的实现方式就是一个字节数组。CARDTABLE〔thisaddress9〕0;
  这段代码代表着卡表标记的的逻辑。实际上卡表就是映射了一块块的内存地址,这些内存地址块称为卡页,从代码可以看出每个卡页的大小就是29512字节。
  如果转换为16进制,数组的0,1号元素就映射为0x0000~0x01FF(0511)、0x0200~0x03FF(5121023)内存地址的卡页。
  只要一个卡页内的对象存在一个或者多个跨代对象指针,就将该位置的卡表数组元素修改为1,表示这个位置为脏,没有则为0。
  在GC的时候,就直接把值为1对应的卡页对象指针加入GCRoots一起扫描即可。
  有了卡表,我们就不需要去在发生MinorGC的时候扫描整个老年代了,性能得到了极大的提升。卡表的问题写屏障
  卡表的数组元素要修改成1,也就是脏的状态,对于HotSpot来说是通过写屏障来实现的,实际上就是在其他分代引用了当前分代的对象时候,在对引用进行赋值的时候进行更新,更新的方式类似AOP的切面思想。voidoopfieldstore(oopfield,oopnewvalue){引用字段赋值操作fieldnewvalue;写后屏障,在这里完成卡表状态更新postwritebarrier(field,newvalue);}
  写屏障带来的问题就是额外的性能开销,不过这个问题不大,还能接受。伪共享
  另外存在的问题就是我之前文章写过的,伪共享问题(如果你不知道什么是伪共享,请翻看我之前的文章)。
  缓存行通常来说都是64字节,一个卡表元素1个字节,占用的卡页内存大小就是6451232KB的大小。
  如果多线程刚好更新刚好处于这32KB范围内的对象,那么就会对性能产生影响。
  怎么解决伪共享问题?
  JDK7之后新增了一个参数XX:UseCondCardMark,他代表是否开启卡表更新的判断,没有被标记过才标记为脏。if(CARDTABLE〔thisaddress9〕!0)CARDTABLE〔thisaddress9〕0;三色标记法
  卡表解决了跨代收集和根节点枚举的性能问题。而有了这些措施实际上枚举根节点这个过程造成的STW停顿已经属于可控范围。
  另外还存在一个问题就是接下来从GCRoots开始遍历,怎么才能高效的标记这些对象,这就是三色标记法的作用了。因为如果堆内的对象越多,那么显然标记产生的停顿时间就越长。
  以现在我们熟知的CMS或者G1来举例,GC的前两个步骤如下:初始标记:标记GCROOT能关联到的对象,这一步需要STW,但是停顿的时间很短。并发标记:从GCRoots的直接关联对象开始遍历整个对象图的过程,这个时间会比较长,但是现在是可以和用户线程并发执行的,这个效率的问题就是三色标记关注的问题。
  在三色标记法中,把从GCRoots开始遍历的对象标记为以下三种颜色:白色,在刚开始遍历的时候,所有的对象都是白色的灰色,被垃圾回收器扫描过,但是至少还有一个引用没有被扫描黑色,被垃圾回收器扫描过,并且这个对象的引用也全部都被扫描过,是安全存活的对象
  整个标记的过程如下,首先刚开始从GCRoots开始遍历的时候肯定所有的对象都是白色的。
  接着AG对象被扫描到变成灰色,然后AG对象的引用也都被扫描,AG对象变成黑色。
  BC对象开始被扫描变成灰色,他们的引用也被扫描完成后自己也就都变成了黑色。
  而后D对象也一样会经历从灰色到黑色的过程(偷点懒,省略一张无关紧要的过程图吧)
  最后剩下的EF节点就是可以被回收的对象了。
  三色标记的问题
  虽然三色标记法很高效,但是也会引申出其他的问题。
  首先我们上文说过并发标记的过程是不会STW的,就是你妈在打扫卫生,而你在旁边一直丢垃圾,这也没关系,大不了最后就是还有一些垃圾没扫干净而已。
  对于三色标记来说就是把应该要清理的对象标记成存活,这样本次GC就无法清理这个对象,这个被称作为浮动垃圾,解决方案就是等下次GC的时候再清理,这次扫不干净就等你妈下次打扫卫生的时候再清理就行了。
  与此相反,如果把存活对象标记成需要清理,那么就有点麻烦了,这样你的程序就该出问题了。
  所以经过研究表明,只有同时满足两个条件才会发生这种对象消失的问题:插入了一条或者多条黑色到白色对象的引用删除了全部从灰色到白色对象的引用
  那么,针对这个问题也有两种解决方案:增量更新和原始快照,如果对应到垃圾回收器的话,CMS使用的是增量更新,而像G1则是使用原始快照。
  思路就是既然要同时满足,那么我只需要破坏其中一个条件那么不就可以了吗?
  所以,先看上面我们的例子中的一个场景,假设A扫描完,刚好C成为灰色,此时CD的引用删除,同时AD新增了引用(同时满足两个条件了吧),这样本来按照顺序接下来D应该会变成黑色(黑色对象不应该被清理),但是由于CD没有引用了,A已经成为了黑色对象,他不会再被重新扫描了,所以即便新增了AD的引用,D也只能成为白色对象,最终被无情地清理。
  增量更新解决方案就是,他会把这些新插入的引用记录下来,扫描结束之后,再以黑色对象为根重新扫描一次。这样看起来不就是增量更新吗?新插入的记录再扫一次!
  原始快照则是去破坏第二个条件,他把这个要删除的引用记录下来,扫描结束之后,以灰色对象为根重新扫描一次。所以就像是快照一样,不管你删没删,其实最终还是会按照之前的关系重新来一次。
  后台回复【pdf】获取百本计算机电子书和大厂面试精华,文章每周持续更新。我是艾小仙,阿里巴巴技术专家,我们下期见!
  面经PDF整理

何炅又摊上事了,被举报了昨天也就是说本月20号,知名导演兼作家的刘信达,在社交平台突然发布消息,称自己实名举报湖南卫视主持人何炅,并要求广电总局将何炅开除!最后有惊喜哟,评论美三代,点赞富一生,……不愧是杨洋!你是我的荣耀搞垮视频网站,后面就看李易峰了可靠梦久会员朋友可以通过提前点餐提前看到《你是我的荣耀》的大结局。结果,腾讯的视频软件一更新就崩溃了,很多网友顿时看不到了。这真是一部长寿剧。令人难以置信的是,腾讯视频作……姚策离世亲生父母此时离婚怎么看都不合理,还有更不合理的事情关于姚策与郭威错换人生28年的事情,最近两个家庭又有了新的动向,一方面许母誓要查找真相,怀疑当年的‘错换’其实是被人为‘偷换’,而另一方面,郭威到江西祭祖的同时,网上曝出郭威养……5位短发女神现状四人年过50未婚,只她的婚姻让人羡慕上世纪90年代的中国香港出现了很多又飒又靓的短发女神。袁洁莹、陈法蓉、萱萱、张可颐、袁咏仪这五位女星更是其中的翘楚。如今看着港剧长大的90后很多已经成家立业了,那这……新世界最新读后感点评由孙红雷、张鲁一、尹昉领衔主演的电视剧《新世界》已经圆满收官,观众们对于这部剧的评价也是褒贬不一。在剧中的金海依旧是一个豪横讲义气的硬茬子,这样的大哥形象应该也是观众们喜……浪姐成团综艺将开录,真假姐妹大考验来临,好戏才刚开始历时整整四个月,《乘风破浪的姐姐》终于收尾了,但是关于姐姐们的故事仿佛才刚刚开始。芒果充分的展现了一个顶级平台的能力,这边《乘风破浪的姐姐》刚刚结束,那边姐姐们的后续资源……中印第六轮军长级会谈,中国军演强势回应,印度释放自相矛盾信号根据印度《新德里时报》的消息,8月8日,中印第六轮军长级会谈在中印边境实际控制线附近的斗拉特别奥里地进行。实际上,早在几天前的8月2日,中印刚刚在中印边境实际控制位于中方一侧的……董明珠狂砸30亿,造出国产埃尔法,今库存成山1年销量2000随着社会的发展现在买车是一件很正常的事情,但是因为国产车还没有发展起来,所以更多人喜欢的还是合资车。但是合资车好是好,就是有一个致命的缺点,那就是贵,所以大家都将目光放在了国产……贫困生女孩面试前的行为震惊人事经理,有人被感动有人称心机近日,一段视频在网上被关注,一名贫困生女孩来到一家汽车销售公司面试。人事经理通知她十一点过来,但她八点多就到了,闲来无事,她就开始打扫起房间。外厅,小会议室的桌椅被……爷们!华晨宇承认与张碧晨有一子又是吃瓜的一天。华晨宇发文:是的,我们有一个孩子。瞬间冲上了热搜榜第一,华晨宇承认与张碧晨育有一个孩子。这个消息一宣布,着实震惊了不少人。随后,张碧晨发……广州万科城一条高速,改变一座广州城,增城买房首选有时候,一座城市的改变,是从一条道路开始。01。两条快速,两次城市变局近20年来,最知名的一次变局,莫过于华南快速的通车。原本,从天河到番禺,要横跨两次珠江,如今,珠江新……高圆圆穿这样看夕阳?粉丝一看全暴动高圆圆因演出《椅天屠龙记》中周芝若一角而走红,典雅气质深受粉丝喜爱。今年38岁的她保养得宜,今(1)日微博上流出多张她在海边看夕阳的照片,仙气十足的模样引起热议。高圆圆时……
贾宝玉与普通纨绔子弟的区别,脂语古今未见之一人的真正含义读《红楼梦》,有的读者认为贾宝玉就是一个普通的纨绔子弟,以为贾宝玉的毛病其他的纨绔子弟都有,没什么可值得大惊小怪的。还有的读者详细的列举了贾珍、贾琏的恶劣事件,和贾宝玉一比较,……安全生产双体系是什么(安全生产双体系)企业双体系建设指的是风险分级管控和隐患排查治理体系建设,有效的管控措施会杜绝生产事故的发生,双体系在安全生产中的重要性已经成为不争的事实。近日,白塔镇安环办工作人员在日常巡查中……麦迪娜生二胎视频曝光,生前痛到表情扭曲,姜潮差点没赶上陪产姜潮和麦迪娜算是娱乐圈结婚比较早的夫妇,麦迪娜比姜潮大,因为一档节目认识,姜潮主动追求,还没在一起的时候姜潮就主动告诉妈妈自己遇到真心喜欢的女孩子,两人也是相恋几年后才结婚,中……中国国学网(国学网精校本!)中国国学网(国学网精校本!)史记》是由西汉时代司马迁撰写的我国第1部纪传体通史。记载了上自上古传说中的黄帝时代,下至汉武帝元狩元年间共3000多年的历史,司马迁以其究天人……研修感言(校本研修感悟!)研修感言(校本研修感悟!)桃源县文星小学李林波老师从桃源县教师校本研修管理者工作坊第一次线下集中研修活动5月22日至今已有170个日日夜夜,弹指一挥间,我回首走过的……会议简报范文(范文一会议简报)会议简报范文(范文一会议简报)部门例会会议简报20XX年7月22日8:30项目经理部召开本周例会,首先由朴勇军经理传达公司周例会主要资料,之后由各项目板块负责人汇报……友情已经不在朋友圈朋友是什么?朋友圈是什么?信息的快捷化,阻隔不了真友情,却也看清了假友情朋友圈再也不是友情的延续三天可见成为常见,即保护了自己,又疏离了假朋友朋友是什么?在你需要帮助的时候有t……重温情深深20年后,终于明白为何如萍不会爱上杜飞不知道陪伴了多少一代又一代青春岁月的经典琼瑶剧《情深深雨濛濛》,如今再回首经典,倒是觉得失了原来的味道,可能是自己长大了,看待里面的剧情和角色居然会觉得有些狗血和毁三观,但不可……防御机制(防御机制概念理解)防御机制(防御机制概念理解)我们现在身处和平年代,对战争和历史很难感同身受,但是我们要知道我们现在身处的国家,一片繁荣昌盛的背后,是无数可敬的人在默默付出,这个世界上从来……会计档案管理办法(最实用的档案管理分类办法)会计档案管理办法(最实用的档案管理分类办法)档案分类常规分为四类:文书档案、科技档案、专门档案和特殊档案;文书档案主要为党群组织、机关、团体、企事业单位在行政……两人合伙协议(合伙公司,股东合作协议书)两人合伙协议(合伙公司,股东合作协议书)甲方:住址:身份证号:一方:住址:身份证号:甲,乙双方因共同目的,投资设立了有限责任公司(以下简称公司)事……特斯拉电池日(车企自产电池走得通吗?)特斯拉电池日(车企自产电池走得通吗?)动力电池作为纯电动汽车成本占比最大的一块,一直是整车企业眼前的肥肉。获得电池部分的利润,是整车企业垂涎三尺、处心积虑、朝思暮想的事情……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网