CMS和G1的区别
所属分类 jvm
浏览量 1679
CMS
以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现
执行过程
1 初始标记:独占PUC,仅标记GCroots能直接关联的对象
2 并发标记:可以和用户线程并行执行,标记所有可达对象
3 重新标记:独占CPU(STW),对并发标记阶段用户线程运行产生的垃圾对象进行标记修正
4 并发清理:可以和用户线程并行执行,清理垃圾
优点
并发,低停顿
缺点
1 对CPU非常敏感:在并发阶段虽然不会导致用户线程停顿,但是会因为占用了一部分线程使应用程序变慢
2 无法处理浮动垃圾:在最后一步并发清理过程中,用户线程执行也会产生垃圾,这部分垃圾需要等到下一次gc的时候清
3 CMS使用“标记-清理”法会产生大量的空间碎片,碎片过多,会给大对象空间的分配带来很大的麻烦,
会出现老年代还有很大的空间但无法找到足够大的连续空间来分配当前对象,不得不提前触发一次FullGC,
CMS 出现FullGC的原因
1 年轻带晋升到老年带没有足够的连续空间,很有可能是内存碎片导致的
2 在并发过程中,JVM预估在并发过程结束之前堆就会满,需要提前触发FullGC
G1
特点
1 并行于并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU来缩短stop-The-World停顿时间。
2 分代收集:分代概念在G1中依然得以保留。
虽然G1可以不需要其它收集器配合就能独立管理整个GC堆,
但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。
G1可以自己管理新生代和老年代。
3 空间整合:由于G1使用了独立区域(Region)概念,G1从整体来看是基于“标记-整理”算法实现收集,
从局部(两个Region)上来看是基于“复制”算法实现的,G1运作期间不会产生内存碎片。
4 可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,
但G1除了追求低停顿外,还能建立可预测的停顿时间模型,
能明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
与其它收集器相比,G1变化较大的是它将整个Java堆划分为多个大小相等的独立区域(Region),
虽然还保留了新生代和来年代的概念,但新生代和老年代不再是物理隔离的,它们都是一部分Region(不需要连续)的集合。
G1使用Remembered Set来管理相关的对象引用信息,避免全堆扫描
如果不计算维护Remembered Set的操作,G1收集器的运作大致可划分为以下几个步骤:
1 初始标记(Initial Making)
2 并发标记(Concurrent Marking)
3 最终标记(Final Marking)
4 筛选回收(Live Data Counting and Evacuation)
初始阶段只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Next Top Mark Start)的值,
让下一阶段用户程序并发运行时,能在正确可以用的Region中创建新对象,这个阶段需要停顿线程,但耗时很短。
并发标记阶段是从GC Roots开始对堆中对象进行可达性分析,找出存活对象,这一阶段耗时较长但能与用户线程并发运行。
最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这阶段需要停顿线程,但可并行执行。
最后筛选回收阶段对各个Region的回收价值和成本进行排序,
根据用户所期望的GC停顿时间来制定回收计划,这一过程也需要停顿线程
上一篇
下一篇
铁娘子董明珠
Redis虚拟槽算法
java关键字volatile原理
关于如何挣钱的35条建议
代理的几种实现方式
RPC原理简介