当前位置: 首页 > 工具软件 > 50CMS > 使用案例 >

CMS和G1的区别

车峻熙
2023-12-01

CMS收集器和G1收集器的区别

区别一:使用的范围不一样

CMS收集器是老年代收集器,可以配合新生代的serial和ParNew收集器一起使用

区别二:STW(stop the world)的时间

CMS收集器:以最小的停顿时间为目标的收集器
G1收集器:可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)

区别三:垃圾碎片

CMSS收集器:是使用标记-清除算法进行的垃圾回收,容易产生碎片
G1收集器:是使用的标记-整理算法,进行了空间整合,降低了内存空间碎片

区别四:垃圾回收的过程不一样

CMS收集器G1收集器
初始标记初始标记
并发标记并发标记
重新标记最终标记
并发清除筛选回收

CMS垃圾回收的4个阶段

初始标记阶段:会让线程全部停止,也就是stop the World,标记GC Roots 可以直接关联的对象,该阶段需要线程停顿但是耗时短
并发标记阶段:对所有的对象进行追踪,这个阶段最耗费时。但这个阶段是和系统并发运行的,所以不会对系统运行造成影响
重新标记阶段:由于第二阶段是并发执行的,一边标记垃圾对象,一边创建新对象,老对象会变成垃圾对象。 所以第三阶段也会进入 Stop the World 状态,并且重新标记,标记的是第二阶段中变动过的少数对象,所以运行速度很快
并发清理阶段:这个阶段也是会耗费很多时间,但由于是并发运行的,所以对系统不会造成很大的影响

G1回收垃圾的4个阶段

初始标记阶段:会让线程全部停止,也就是stop the World,标记GC Roots 可以直接关联的对象,该阶段需要线程停顿但是耗时短
并发标记阶段:对所有的对象进行追踪,这个阶段最耗费时。但这个阶段是和系统并发运行的,所以不会对系统运行造成影响
最终标记阶段:并发标记期间用户程序会导致标记记录产生变动(好比一个阿姨一边清理垃圾,另一个人一边扔垃圾)虚拟机会将这段时间的变化记录在Remembered Set Logs 中。最终标记阶段会向Remembered Set合并并发标记阶段的变化。这个阶段需要线程停顿,也可以并发执行
筛选回收:对每个Region的回收成本进行排序,按照用户自定义的回收时间来制定回收计划

CMS的总结和优缺点

CMS采用的标记-清除算法,标记出垃圾对象,清除垃圾对象,是一个老年代算法。
优点:并发收集低停顿
缺点:会造成内存碎片

G1回收器的特点

G1的出现就是为了替换JDK1.5中出现的CMS,这点已经在JDK9的时候实现了,JDK9默认使用了G1回收器,移除了所有CMS相关的内容。G1和CMS相比,有几个特点:

1.控制回收垃圾的时间

这个是G1的优势,可以控制垃圾回收的时间,还可以建利停顿模型,选择一组合适的region作为回收目标,打到实时收集的目的

2.空间整理

采用标记-整理算法,不会产生空间碎片,这块可以有效的使用连续空间。

3.内存拆分

G1把Java内存拆分成多等份,多个域(region),逻辑上存在新生代和老年代的概念,但是没有严格的区分,Region最多分成2048个

4.大对象处理

在CMS内存中,如果一个对象过大,进入S1、S2区域的时候大于改分配的区域,对象会直接进入老年代。G1处理大对象时会判断对象是否大于一个Region大小的50%,如果大于50%就会横跨多个Region进行存放

G1设置参数

控制G1回收垃圾的时间
-XX:MaxGCPauseMillis=200 (默认200ms)

 类似资料: