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指向了D和B, B和D断开。 此时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变成灰色即可