垃圾收集器关系图
各种垃圾回收器和垃圾回收算法间的关系如下
- Serial:标记-复制
- Serial Old:标记-压缩
- ParNew:标记-复制
- Parallel Scavenge:标记-复制
- Parallel Old:标记-压缩
- CMS(Concurrent-Mark-Sweep):(并发)标记-清除
- G1(Garbage-First):并发标记 + 并行复制
- ZGC/C4:并发标记 + 并发复制
- Shenandoah GC:并发标记 + 并发复制
CMS收集器
描述:
CMS:是追求最短回收停顿时间的收集器
收集过程:
- 初始标记(initial mark):主要是标记一下GC Roots对象和被新生代引用的对象,速度非常快,这个过程需要STW
- 并发标记 (concurrent mark) :主要是GC Roots对象遍历整个对象图的过程,这个过程耗时比较长,-可以并发进行
- 重新标记 (remark) :主要是为了修正并发标记期间,因用户程序继续进行而使标记产生变动的一部分对象
- 并发清除 (concurrent sweep):并发清理对象(会产生浮动垃圾)
收集日志:
缺点:
- CMS收集器对处理器资源非常敏感,会占用一部分线程,而导致应用程序变慢,降低吞吐量
- 会产生浮动垃圾(在并发清理阶段产生的),有可能会出现“Concurrent Mode Failure”失败进而导致另一次完全STW的FullGC。为了防止出现失败的情况,需要预留一部分空间,默认情况下是当老年代使用了68%空间就触发,当老年代增长慢的情况下,可以适当提高这个比例。
- CMS是一款标记-清除算法实现的收集器,所以收集完之后内存会出现很多空间碎片,这样会使得明明有很多空间,但是没有足够大的空间分配给当前对象,而导致FullGC
G1垃圾收集器
描述:
Garbage First收集器,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。
收集过程:
- 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能准确地在可用的Region中分配新对象。
- 并发标记:主要是GC Roots对象遍历整个对象图的过程,这个过程耗时比较长,可以并发进行
- 最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。
- 筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分存活对象复制到Region,这里是需要暂停用户线程的。
优点:
- 可以指定最大停顿时间
- 分Region的内存布局
- 按收益动态的确认回收集
- 采用标记复制