G1和CMS的区别

CMS和G1垃圾回收流程区别

CMS流程

—>初始标记(只标记最根上的对象STW)>并发标记(百分之八十时间)

>重新标记(STW 并发标记过程中错标 重新标记) CMS和G1采用的三色标记,区别是CMS增量更新,G1采用的快照替换
>并发清理(这个过程产生的垃圾叫浮动垃圾 只能等下一次CMS)

其中初始标记和重新标记会STW。

ps:并发清理时因为有浮动垃圾的存在,所以CMS不能等老年代全满了才回收(回从年轻代过来浮动垃圾)

有一个参数in ni shou 哦 可 pan ci:老年代达到总空间多少的时候开始启动回收进程。

有个版本是90% 如果业务负责,会很快填充到百分百,此时老年代满了之后 最夸张的是会用s o单线程回收。

G1:引入了分区,物理上分区,逻辑上分代

分区回收:哪个区快满了,可以动态的清掉

优先回收:花费时间少 垃圾比例高的Region(区)

每个区清空之后可以根据需要动态的指定为 伊甸区 老年代 

G1垃圾回收器 新生代 survivor区edon区,老年代,等代的占比会自己动态的调整

CMS和G1三色标记算法区别

先看看什么是三色标记

三色标记应用于并发标记的场景:对象树中哪个标过了 哪个没有标 ,下一次回来,必须从现有的状态继续走。

黑:对象树中 自己和子节点全部都标记过了

灰:自己标记过 子节点没完全标记过

白:自己没标记过

三色标记会出现漏标的问题

如果垃圾回收线程此时扫描对象树的状态是:A-B-D

等业务线程执行一断时间后 此时 A指向了DB, BD断开。 此时D不是垃圾,但是垃圾回收器以为D是垃圾(因为BD断开,垃圾回收器不扫黑色A)

如图:

CMS解决方案

业务线程A指向D的时候把A变成灰色(通过写屏障),但在两个垃圾回收线程并发标记的时候这个算法有个bug

  m1垃圾回收正在标记A,已经标记完成属性1 正在标记属性2

  m2业务线程把A属性1指向白色对象D

  m3垃圾回收线程把A标记成灰色

       m1垃圾回收把属性2标记完成,把A标记成黑色,结果D还是会漏标。

所以CMS在remark阶段 会从头扫一遍以解决这个问题(STW)

G1解决方案

SATB,把灰色对象指向白色对象引用消失的时候,把这个引用放到一个堆栈里面。

当垃圾回收线程回来的时候,检查一个堆栈(有没有 灰色指向白色引用消失的过程),找到D之后把D变成灰色即可

原文地址:https://www.cnblogs.com/ssskkk/p/15536597.html