CMS收集器
一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现的,整个过程分为4个步骤:
(1)初始标记(CMS initial mark)
(2)并发标记(CMS concurrent mark)
(3)重新标记(CMS remark)
(4)并发清除(CMS concurrent sweep)
其中初始标记、重新标记仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发的执行的。
image.png
三个缺点:
(1)CMS收集器对CPU资源非常敏感。默认启动的回收线程数是(CPU数量+3)/4;
(2)CMS收集器无法处理浮动垃圾,可能出现“Concurrent ModeFailure”失败而导致另一次Full GC的产生。
“浮动垃圾”指CMS并发清理阶段用户线程还在运行,伴随程序运行自然有新的垃圾不断产生,这部分垃圾出现在标记过程之后,只能留待下一次GC时再清理掉。
(3)基于“标记-清除”,收集结束时会有大量的空间碎片产生。
碎片过多可能出现,老年代有很大空间剩余,但无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。
-XX:+UseCMSCompactAtFullCollection(默认开启),用于在CMS收集器顶不住要进行Full GC时开启内存碎片的合并整理过程。
-XX:CMSFullGCsBeforeCompaction,这个参数用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的。
7、G1收集器
运行步骤:
1、初始标记
2、并发标记
3、最终标记
4、筛选回收
特点:并行与并发
分代收集
空间整合:基于“标记-整理”,G1运行期间不会产生内存空间碎片,收集后能提供规整可用的可用内存,有利于程序长时间运行。
可预测的停顿:能让使用者指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
G1收集器将整个java堆划分为多个大小相等的独立区域(Region),跟踪各个Region里面垃圾堆积的价值大小(回收所获得空间大小以及回收所需的时间经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
网友评论