CMS和G1的异同
2021-09-09 15:27:32 0 举报
jvm垃圾回收器CMS和G1的区别
作者其他创作
大纲/内容
重新标记使用的是三色标记中原始快照算法
多个GC线程
-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)-XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次
低停顿,能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)
并发收集,低停顿,响应时间短,stw时间很短,用户体验很好
先对regiond的回收价值和成本进行排序,然后根据用户期望的停顿时间(-XX:MaxGCPauseMillis)制定一个回收计划,根据这个时间和计算出来的回收成本来优先回收最大价值的region
低吞吐量,因为多个GC线程和用户线程同时在争夺CPU资源
G1会追踪所有Region的回收价值,回收价值的意思就是这个Region中包含了多少的垃圾对象,回收这些垃圾对象需要耗费多少的时间。在垃圾回收的过程中,G1通过我们设置的预期停顿时间,追踪每个Region的回收价值,在有限的时间内,去尽可能的多回收一些垃圾对象。通过 -XX:+UseG1GC 参数就可以指定使用G1垃圾回收器了,G1里面的Region的数量是根据堆内存的大小自动计算的,默认情况下是堆内存/2048,假如我们的堆内存是4G,那么每个Region的大小就是2M,当然也可以通过参数-XX:G1HeapRigionSize 指定每个Rigion大小,一般使用默认的就好。
初始标记
重新标记
最终标记
并发整理
CMS回收算法采用的是标记--清除算法,会产生大量的空间碎片
cms运行流程
并发清理,用户线程和GC线程同时存在,主要是对没有标记的区域进行清除,如果这段期间用户线程产生了新的存活对象,则标记为黑色不处理
并发标记
有短暂的stw时刻
不涉及stw时刻
CMS
G1
font color=\"#ff0000\" style=\"\
解决方案:设置CMS参数-XX:CMSInitiatingOccupancyFraction,默认92%,将老年代设置为对象快要占满一定比例,比如80%时,就进行fullgc,剩余的20%不用,防止老年代正在进行fullgc时,新对象到达老年代时,剩余的20%可以尽可能的保障足够用
用户线程和GC线程同时在运行,会产生浮动垃圾和错标对象
用户线程和GC 线程同时运行,标记那些GC roots 对象图的过程,不涉及stw
涉及stw时刻
一:浮动垃圾(非垃圾对象--垃圾对象):下一次GC清理 二:错标对象(垃圾对象--非垃圾对象):增量更新算法中通过写屏障来跟踪和记录引用关系的插入操作
G1运行流程
比如说老年代此时有1000个Region都满了,但是因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region(CollectionSet,要回收的集合),尽量把GC导致的停顿时间控制在我们指定的范围内。这个阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率
一:都是低停顿,用户体验好二:GC过程中,前三个阶段相同(初始标记、并发标记、重新/最终标记)三:高吞吐,GC线程和用户线程并发,多个GC线程运行
暂停用户线程,标记GCroots 的直接引用对象,stw时间很短
一:CMS采用的算法是标记清除算法,G1采用的是复制算法二:因为CMS采用的是标记清除算法,会产生大量的空间碎片,同时可以设置参数进行边fullgc,边清理碎片,G1采用的是复制算法,不需要进行碎片的清理三:CMS 在fullgc时,用户线程和gc线程同时在运行,如果有新的大对象产生或者因为空间碎片的不断积累,可能老年代会再次fullgc,这样则会导致concurrent mode failure 情况,最终会由serial old 垃圾收集器来暂停所有用户线程,单GC线程来回收垃圾,当然也可以通过设置老年代的fullgc大小来减少这种情况的发生,比如可以设置老年代fullgc时的内存大小为80%,剩余的20%则可以预防这种情况发生。G1中有专门存放大对象的区域Humongous,当对象超过region的50%时,则认为是大对象,存放在这个区域四:错标对象处理,CMS的重新标记时对错标对象的处理为三色标记的增量更新算法,主要是通过对引用关系的插入操作的记录(写屏障)来重新标记错标对象;漏标对象处理,并发清理阶段将这种对象标记为黑色对象,不处理,下一次gc清理。G1最终标记时,对错标对象采用的是三色标记的原始快照算法,主要是通过对引用关系的删除操作的记录(写屏障)来重新标记对象五:G1相对于CMS有了一个stw时刻,筛选回收阶段六:G1可以实现用户线程暂停时间的设定,即回收时间可控font color=\"#000000\
G1回收算法采用的是复制算法,不会产生大量的空间碎片
重新对并发标记过程中产生漏标错标的对象进行重新标记
和CMS重新标记一样,重新对并发标记过程中产生漏标错标的对象进行重新标记
相同点
高吞吐量,可以通过设置用户期望的停顿时间来最大程度上的满足用户线程的执行
解决方案:可以通过设置参数来实现边回收边清理空间碎片
为什么用户可以设定回收时间?
会出现\"Concurrent mode faiure\"并发失败情况,当出现这种情况是,会自动使用Serial Old 垃圾回收方式,进行单线程回收垃圾对象,暂停所有的用户线程,单线程回收垃圾
异同点
重新标记使用的是三色标记中增量更新算法
筛选回收
可预测的停顿时间,通过设置用户期望的停顿时间-XX:MaxGCPauseMills参数来让用户在期望的时间内进行最大价值的垃圾回收
0 条评论
下一页