CMS收集器是老年代收集器,可以配合新生代的serial和ParNew收集器一起使用
CMS收集器:以最小的停顿时间为目标的收集器
G1收集器:可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
CMSS收集器:是使用标记-清除算法进行的垃圾回收,容易产生碎片
G1收集器:是使用的标记-整理算法,进行了空间整合,降低了内存空间碎片
CMS收集器 | G1收集器 |
---|---|
初始标记 | 初始标记 |
并发标记 | 并发标记 |
重新标记 | 最终标记 |
并发清除 | 筛选回收 |
初始标记阶段:会让线程全部停止,也就是stop the World,标记GC Roots 可以直接关联的对象,该阶段需要线程停顿但是耗时短
并发标记阶段:对所有的对象进行追踪,这个阶段最耗费时。但这个阶段是和系统并发运行的,所以不会对系统运行造成影响
重新标记阶段:由于第二阶段是并发执行的,一边标记垃圾对象,一边创建新对象,老对象会变成垃圾对象。 所以第三阶段也会进入 Stop the World 状态,并且重新标记,标记的是第二阶段中变动过的少数对象,所以运行速度很快
并发清理阶段:这个阶段也是会耗费很多时间,但由于是并发运行的,所以对系统不会造成很大的影响
初始标记阶段:会让线程全部停止,也就是stop the World,标记GC Roots 可以直接关联的对象,该阶段需要线程停顿但是耗时短
并发标记阶段:对所有的对象进行追踪,这个阶段最耗费时。但这个阶段是和系统并发运行的,所以不会对系统运行造成影响
最终标记阶段:并发标记期间用户程序会导致标记记录产生变动(好比一个阿姨一边清理垃圾,另一个人一边扔垃圾)虚拟机会将这段时间的变化记录在Remembered Set Logs 中。最终标记阶段会向Remembered Set合并并发标记阶段的变化。这个阶段需要线程停顿,也可以并发执行
筛选回收:对每个Region的回收成本进行排序,按照用户自定义的回收时间来制定回收计划
CMS采用的标记-清除算法,标记出垃圾对象,清除垃圾对象,是一个老年代算法。
优点:并发收集低停顿
缺点:会造成内存碎片
G1的出现就是为了替换JDK1.5中出现的CMS,这点已经在JDK9的时候实现了,JDK9默认使用了G1回收器,移除了所有CMS相关的内容。G1和CMS相比,有几个特点:
这个是G1的优势,可以控制垃圾回收的时间,还可以建利停顿模型,选择一组合适的region作为回收目标,打到实时收集的目的
采用标记-整理算法,不会产生空间碎片,这块可以有效的使用连续空间。
G1把Java内存拆分成多等份,多个域(region),逻辑上存在新生代和老年代的概念,但是没有严格的区分,Region最多分成2048个
在CMS内存中,如果一个对象过大,进入S1、S2区域的时候大于改分配的区域,对象会直接进入老年代。G1处理大对象时会判断对象是否大于一个Region大小的50%,如果大于50%就会横跨多个Region进行存放
控制G1回收垃圾的时间
-XX:MaxGCPauseMillis=200 (默认200ms)