范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JVM垃圾回收的三色标记算法实现,内容太干

  三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。JVM中的 CMS、G1垃圾回收器 所使用垃圾回收算法即为三色标记法。 三色标记算法思想
  三色标记法将对象的颜色分为了黑、灰、白,三种颜色。
  白色 :该对象没有被标记过。(对象垃圾)
  灰色 :该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾)
  黑色 :该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象)
  算法流程
  从我们 main 方法的根对象(JVM中称为GC Root )开始沿着他们的对象向下查找,用黑灰白的规则,标记出所有跟GC Root 相连接的对象,扫描一遍结束后,一般需要进行一次短暂的STW(Stop The World),再次进行扫描,此时因为黑色对象的属性都也已经被标记过了,所以只需找出灰色对象并顺着继续往下标记(且因为大部分的标记工作已经在第一次并发的时候发生了,所以灰色对象数量会很少,标记时间也会短很多), 此时程序继续执行,GC 线程扫描所有的内存,找出扫描之后依旧被标记为白色的对象(垃圾),清除。
  具体流程:  首先创建三个集合:白、灰、黑。  将所有对象放入白色集合中。  然后从根节点开始遍历所有对象(注意这里并不 递归遍历 ),把遍历到的对象从白色集合放入灰色集合。 之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合  重复 4 直到灰色中无任何对象  通过write-barrier检测对象有变化,重复以上操作  收集所有白色对象(垃圾)  三色标记存在问题浮动垃圾:并发标记的过程中,若一个已经被标记成黑色或者灰色的对象,突然变成了垃圾,由于不会再对黑色标记过的对象重新扫描,所以不会被发现,那么这个对象不是白色的但是不会被清除,重新标记也不能从 GC Root 中去找到,所以成为了浮动垃圾,浮动垃圾对系统的影响不大,留给下一次GC进行处理即可 。 对象漏标问题(需要的对象被回收):并发标记的过程中,一个业务线程将一个未被扫描过的白色对象断开引用成为垃圾(删除引用),同时黑色对象引用了该对象(增加引用)(这两部可以不分先后顺序);因为黑色对象的含义为其属性都已经被标记过了,重新标记也不会从黑色对象中去找,导致该对象被程序所需要,却又要被GC回收,此问题会导致系统出现问题,而 CMS 与G1 ,两种回收器在使用三色标记法时,都采取了一些措施来应对这些问题,CMS对增加引用环节进行处理(Increment Update),G1则对删除引用环节进行处理(SATB)。  解决办法
  在JVM虚拟机中有两种常见垃圾回收器使用了该算法:CMS(Concurrent Mark Sweep)、G1(Garbage First) ,为了解决三色标记法对对象漏标问题各自有各自的法:  CMS回顾
  CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求(但是实际由于某些问题,很少有使用CMS作为主要垃圾回收器的)。
  从名字(包含"Mark Sweep")上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括:1)初始标记(CMS initial mark) 2)并发标记(CMS concurrent mark) 3)重新标记(CMS remark) 4)并发清除(CMS concurrent sweep)
  其中初始标记、重新标记这两个步骤仍然需要"Stop The World"。初始标记仅仅只是标记一下GCRoots能直接关联到的对象,速度很快;
  并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
  重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;
  最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
  CMS解决办法:增量更新
  在应对漏标问题时,CMS使用了增量更新(Increment Update)方法来做:
  在一个未被标记的对象(白色对象)被重新引用后, 引用它的对象若为黑色则要变成灰色,在下次二次标记时让GC线程继续标记它的属性对象 。
  但是就算是这样,其仍然是存在漏标的问题:  在一个灰色对象正在被一个GC线程回收时,当它已经被标记过的属性指向了一个白色对象(垃圾)  而这个对象的属性对象本身还未全部标记结束,则为灰色不变  而这个GC线程在标记完最后一个属性后,认为已经将所有的属性标记结束了,将这个灰色对象标记为黑色,被重新引用的白色对象,无法被标记  CMS另两个致命缺陷CMS采用了 Mark-Sweep 算法,最后会产生许多内存碎片,当到一定数量时,CMS无法清理这些碎片了,CMS会让Serial Old 垃圾处理器来清理这些垃圾碎片,而Serial Old 垃圾处理器是单线程操作进行清理垃圾的,效率很低。所以使用CMS就会出现一种情况,硬件升级了,却越来越卡顿,其原因就是因为进行 Serial Old GC 时,效率过低。 解决方案:使用 Mark-Sweep-Compact 算法,减少垃圾碎片 调优参数(配套使用): -XX:+UseCMSCompactAtFullCollection 开启CMS的压缩
  -XX:CMSFullGCsBeforeCompaction 默认为0,指经过多少次CMS FullGC才进行压缩  当JVM认为内存不够,再使用CMS进行并发清理内存可能会发生OOM的问题,而不得不进行 Serial Old GC ,Serial Old 是单线程垃圾回收,效率低 解决方案:降低触发 CMS GC 的阈值,让浮动垃圾不那么容易占满老年代 调优参数: -XX:CMSInitiatingOccupancyFraction 92% 可以降低这个值,让老年代占用率达到该值就进行CMS GC  G1回顾
  G1(Garbage First)物理内存不再分代,而是由一块一块的 Region 组成,但是逻辑分代仍然存在。G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
  Region中还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。每个Region的大小可以通过参数 -XX:G1HeapRegionSize 设定,取值范围为1MB~32MB,且应为2的N次幂。而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中,G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待,如图所示
  G1前置知识
  Card Table(多种垃圾回收器均具备)  由于在进行 YoungGC 时,我们在进行对一个对象是否被引用的过程,需要扫描整个Old区,所以JVM设计了CardTable ,将Old区分为一个一个Card,一个Card有多个对象;如果一个Card中的对象有引用指向Young区,则将其标记为Dirty Card ,下次需要进行YoungGC 时,只需要去扫描Dirty Card 即可。 Card Table 在底层数据结构以  Bit Map 实现。
  RSet(Remembered Set)
  是辅助GC过程的一种结构,典型的空间换时间工具,和Card Table有些类似。
  后面说到的CSet(Collection Set)也是辅助GC的,它记录了GC要收集的Region集合,集合里的Region可以是任意年代的。
  在GC的时候,对于old->young和old->old的跨代对象引用,只要扫描对应的CSet中的RSet即可。逻辑上说每个Region都有一个RSet,RSet记录了其他Region中的对象引用本Region中对象的关系,属于points-into结构(谁引用了我的对象)。
  而Card Table则是一种points-out(我引用了谁的对象)的结构,每个Card 覆盖一定范围的Heap(一般为512Bytes)。G1的RSet是在Card Table的基础上实现的:每个Region会记录下别的Region有指向自己的指针,并标记这些指针分别在哪些Card的范围内。这个RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。每个 Region 中都有一个RSet ,记录其他Region 到本Region 的引用信息;使得垃圾回收器不需要扫描整个堆找到谁引用当前分区中的对象,只需要扫描RSet即可。
  CSet(Collection Set)
  一组可被回收的分区Region的集合, 是多个对象的集合内存区域。
  新生代与老年代的比例
  5% - 60% ,一般不使用手工指定,因为这是G1预测停顿时间的基准,这地方简要说明一下,G1可以指定一个预期的停顿时间,然后G1会根据你设定的时间来动态调整年轻代的比例,例如时间长,就将年轻代比例调小,让YGC尽早行。
  G1解决办法:SATB
  SATB(Snapshot At The Beginning), 在应对漏标问题时,G1使用了 SATB 方法来做,具体流程: 在开始标记的时候生成一个快照图标记存活对象  在一个引用断开后,要将此引用推到GC的堆栈里,保证白色对象(垃圾)还能被GC线程扫描到(在**write barrier(写屏障)**里把所有旧的引用所指向的对象都变成非白的)。  配合 Rset ,去扫描哪些Region引用到当前的白色对象,若没有引用到当前对象,则回收 SATB详细流程SATB是维持并发GC的一种手段。G1并发的基础就是SATB。SATB可以理解成在GC开始之前对堆内存里的对象做一次快照,此时活的对像就认为是活的,从而开成一个对象图。  在GC收集的时候,新生代的对象也认为是活的对象,除此之外其他不可达的对象都认为是垃圾对象。  如何找到在GC过程中分配的对象呢?每个region记录着两个top-at-mark-start(TAMS)指针,分别为prevTAMS和nextTAMS。在TAMS以上的对象就是新分配的,因而被视为隐式marked。  通过这种方式我们就找到了在GC过程中新分配的对象,并把这些对象认为是活的对象。  解决了对象在GC过程中分配的问题,那么在GC过程中引用发生变化的问题怎么解决呢?  G1给出的解决办法是通过Write Barrier。Write Barrier就是对引用字段进行赋值做了额外处理。通过Write Barrier就可以了解到哪些引用对象发生了什么样的变化。  mark的过程就是遍历heap标记live object的过程,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、back(访问到而且其用到的引用已经完全扫描完)。  整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,然后再标记gray为black;遍历完成之后所有可达对象都是balck的,所有white都是可以回收的。  SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start),但是concurrent的时候并发修改可能造成对象漏标记。  对black新引用了一个white对象,然后又从gray对象中删除了对该white对象的引用,这样会造成了该white对象漏标记。  对black新引用了一个white对象,然后从gray对象删了一个引用该white对象的white对象,这样也会造成了该white对象漏标记。  对black新引用了一个刚new出来的white对象,没有其他gray对象引用该white对象,这样也会造成了该white对象漏标记。  SATB效率高于增量更新的原因?
  因为SATB在重新标记环节只需要去重新扫描那些被推到堆栈中的引用,并配合 Rset 来判断当前对象是否被引用来进行回收;
  并且在最后 G1 并不会选择回收所有垃圾对象,而是根据Region 的垃圾多少来判断与预估回收价值(指回收的垃圾与回收的STW 时间的一个预估值),将一个或者多个Region 放到CSet 中,最后将这些Region 中的存活对象压缩并复制到新的Region 中,清空原来的Region 。 G1会不会进行Full GC?
  会,当内存满了的时候就会进行 Full GC ;且JDK10 之前的Full GC ,为单线程的,所以使用G1需要避免Full GC 的产生。
  解决方案:  加大内存;  提高CPU性能,加快GC回收速度,而对象增加速度赶不上回收速度,则Full GC可以避免;  降低进行Mixed GC触发的阈值,让Mixed GC提早发生(默认45%)

Alpha7IV色调切换创意直出相机大片直出的秘密武器?索尼相机创意外观功能给你答案!创意外观功能,能通过前期设置让照片视频直播画面快速获得较为出色的色彩氛围目前九种预设可供选择,大家也可以自定义效果01hrIN青桔,拜拜了,真伤不起大家有骑共享单车的吗?哈啰青桔美团,这三家比较你更喜欢哪一家呢?市内现在投放的只有这三家的共享单车,目前不能接受的就是青桔。车座很硬,而且离前面的车把特别远,对于小个人来说,身材的拒绝白色污染让石头成为可塑之材用80以上的磷酸钙矿物和有机高分子制成的复合矿物,整体表现出类似塑料的柔韧性,可以进行拉伸或者弯曲。这种复合矿物可作为传统塑料的替代品,且用后还能回归自然,参与地质循环。塑料凭借柔28岁程序员猝死,两万多月供压垮遗孀28岁的字节跳动程序员猝死在健身房,留下了怀孕2个月的遗孀,面对着噩耗,这位年轻妻子在群里发问,怎样退房退款,她实在无力支付每月两万多的房贷。看到这样的消息,失业中的我也被这种情绪阿联酋最受欢迎的支付软件,占领应用榜单下载第一名本文首发公众号中东跨境电商汇,IDEMEDubai,搜索关注获取更多好文根据全球市场情报提供商Statista的研究,疫情出现,全球对非接触式支付的需求飙升,非接触式交易的价值将从俄乌开战,供应链风雨飘摇!但至少这3个品类非常赚钱俄罗斯兵临乌克兰,全球供应链再遭暴击!芯片面临短缺加剧!2022布局这3个类目的跨境电商卖家将可能赚钱!2021年赚到钱的卖家有哪3个特征?本文也将进行分析卖家朋友们,不管您赞不赞苹果下个月发布新机,搭载A15芯片售价亲民,旧款iPhone跌至新低保密工作最难做的公司就是苹果了,一直以来苹果发布会还未举办之前,有关苹果新机的信息总会被曝光,不过这并不是因为苹果公司不重视保密,而是因为苹果公司想要做好保密实在是太难了,作为科技人的寿命竟能计算出来?科学家给出两种算法,算算你能活多少岁关于一个人到底能活到多少岁,很多人都非常好奇。毕竟,有些人经常做着危害身体的行为,依然能活过百岁。而有些人自称懂得长寿秘诀,却连半百都没有活到。其实,随着社会的快速发展,有科学家称前端异常捕获且日志上报处理JavaScript网页异常捕获一异常大概分类一般我们想要捕获的异常大概分类语法错误onerror事件代码块与语法错误代码块不在一起,例如trycatche或者同在一个代码块,但是蔚来造手机传闻背后,VCPE拿出720亿砸向车联网蔚来造手机与否,有关智能车的投资逻辑,早就变了。这几天流传出有关蔚来造手机的消息,引爆点有三原美图手机总裁尹水军加盟蔚来,负责手机线蔚来1个月前在猎聘上密集发布硬件产品岗位,设计智手机面临退休的4个忠告,出现一个以上就说明该换手机了现在的智能手机功能越来越多,性能越来越强,而使用寿命比起前几年的智能手机来也是长了不少,那么一款智能手机现在的寿命是多少呢,该怎么判断,其实看以下4点就够了。屏幕老化我们平常用手机
现阶段最值得买的手机(20003000元档)哈喽,大家好,我是那个不懂数码的小白龙啊,上一篇有人说我的摩托不配吗在此我给大家道歉,我确实忘记了还有摩托罗拉,但在2000元档红米还是称霸,摩托挤不进去,3000元档那肯定有摩托什么是M。2,U。2,SAS,SATA,mSATA?这些电脑接口哪一种传输更快什么是M。2,U。2,SAS,SATA,mSATA,那种传输速率更快随着科技的发展,存储的介质种类越来越多,传输速率越来越快,下面卧龙会玉京龙以常见U。2,M。2,SAS,SATA浪潮软件政府数脑平台荣获2021十大数字大脑优秀产品北京2022年1月27日美通社近日,由中国电子学会信息化和软件服务网主办的2021中国数字经济城市峰会在北京举办。大会以数字经济发展为大背景,聚焦智慧城市与数字政府建设,吸引了来自网络视频监控背后的数据安全隐患如何解决?监控数据信息本身的安全主要是指采用数据加密技术和软件对监控数据信息进行主动保护,如数据保密数据完整性双向身份认证等物联网云计算大数据,当人们感叹时代发展脚步是如此迅速的时候,往往会微信更新,朋友圈可发20张照片,却意在短视频微信刚刚更新到了8。0。19,朋友圈解除了9张照片的限制,可以发布20张照片。说是20张图,其实是以视频的形式展现的,而且类似于抖音快手集成了一些简易视频模板。虽然现在各个短视频平特斯拉起诉千万粉丝大V从某知情人士处获悉,特斯拉将于26日正式起诉某平台千万粉丝网红陈振罡,起诉原由为后者利用信息网络实施诽谤行为。特斯拉相关部门回应称,确有此事,并且已正式向法院提交诉讼。该事件起因源波澜壮阔20世纪互联网诞生20世纪的变化日新月异。不仅科学技术领域以史无前例的速度和广度得到了发展,社会政治经济医疗和哲学等领域也齐头并进。20世纪60年代,各个领域都产生了将计算机通过网络连接在一起的需求新消费日报微信淘宝互联又进一步小红书虚假种草治理初见成效鸡蛋品牌获6亿融资新消费日报1月27日讯,今日新消费晚报的主要内容有2021年全球市场AMOLED智能手机面板出货约6。68亿片传腾讯欲将斗鱼私有化春运前十天我国共发送2。6亿人次。行业要闻微信可以你们喜欢一些在微信名前面加A的人吗?没啥用,很低级的营销手法啊情况一大家都懂得给熟悉认识的人备注了,就算你加了A又有什么用情况二身边做销售的朋友给我的回馈,说自己微信好友满了,优先删除那些加了A的,一看就是销售同行,尼康300mmf4E拍鸟怎么样?300mm的确有点短,我常用的是尼康D700适马150500。不过300mm也不是不能用,去年新上尼康微单Z6尼康28300打鸟效果也不错。要用300F2。8加1。7增距镜才行!有泰坦显卡在所有显卡中是什么地位?泰坦是超越旗舰显卡的存在,超高端显卡,秒杀GTX1080TI,是需要靠信仰的支撑才能入手的王者级显卡!泰坦显卡GeForceGTXTITAN!泰坦显卡是GeForceGTX显卡的一