目录
一、Serial收集器
二、ParNew收集器
三、Parallel Scavenge收集器
四、Serial Old收集器
五、Parallel Old收集器
六、CMS 老年代收集器
七、G1 比较新的回收器
最常使用到的垃圾回收器有如下几种:
下面依次展开介绍。
一、Serial收集器 (新生代收集器,串行GC)
Serial收集器是最基本、发展历史最悠久的收集器。
二、ParNew收集器 (新生代收集器,并行GC)
Serial收集器的多线程版本
三、Parallel Scavenge收集器
(新生代收集器,并行GC)
Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。
设计的初衷是为了尽量缩短STW 时间,GC 停顿时间的缩短是以牺牲吞吐量和新生代空间作为代价的。工作流程同 ParNew 收集器,这个收集器提供了一些参数,可以控制 STW 时间以及吞吐率
相当于承诺用户,在一定时间内就会完成一次 GC,哪怕清理的不是特别干净,但是也能很大程度上的清理到大部分垃圾了
四、Serial Old收集器
(老年代收集器,串行GC)
相当于 Serial 收集器的老年代版本,基本特点差不多,也是单线程的方式进行标记回收的
五、Parallel Old收集器
(老年代收集器,并行GC)=>[老年代,并行,标记-整理 暂停所有用户进程]
使用多线程完成标记整理,效率更高,但是消耗的 CPU 资源更多
六、CMS 老年代收集器
并行 GC =》(采用的是多线程 标记-清除)
特点:尽可能缩短 STW 时间
a) 初始标记 【初始标记】
只是把和 GCRoot 直接相关的对象先标记出来
【这个标记过程时间比较短,GCRoot 直接相关的对象不是很多】
b)并发标记
执行整个标记遍历的过程(从 GCRoot 开始,把所有能访问到的对象都遍历)
不需要暂停用户线程,消耗的时间相对比较久,但是可以和用户线程并发
注意:当进行并发标记的时候,由于用户线程也在执行,可能导致某个对象,刚刚标记成是不是垃圾之后,被应用代码一改,就成了垃圾了。
并发标记完成之后,标记得到的垃圾结果可能就和真实结果之间存在一定的误差~~
c)重新标记(CMS remark) 【STW】
修正刚才的误差,由于刚才出现误差的毕竟是少数,重新标记代价不是很大,虽然 STW 了,用不了多少时间就结束了
d)并发清除(CMS concurrent sweep)
多线程的方式把刚才的垃圾对象都释放掉(直接清除) 也可以和应用线程并发进行
优点:能够让STW时间尽量短
缺点:
1.内存碎片
2.GC操作和应用线程是并发执行的,就更吃CPU资源(对CPU较敏感)
七、G1 比较新的回收器
既能回收新生代,也能回收老年代
每个矩形区域为一个”region“
E 表示伊甸区
S 表示生存去
T 表示老年代
H 表示存放大对象的区域
G1 回收的时候不一定需要一次性的把整个内存都回收完,而是以region为单位进行回收
(回收的粒度更加精细)
针对新生代的 region 同样是使用复制算法进行回收
针对老年代的回收,类似于 CMS,但是有一定的差别
a)初始标记 和 CMS 类似,只去找 GCRoot 直接关联的对象,时间比较短,会涉及 STW
b)并发标记(Concurrent Mark),和应用线程并发执行,进行可达性分析,遍历所有的对象(不涉及 STW) 和 CMS 不一样的是,如果发现某个老年代 region 中已经没存活对象了,就直接回收掉,不去等最后一个环节回收了
Garbage First
c)最终标记,为了修正第二步b)产生的误差 SATB(snapshot-at-the-begining)
d)筛选回收



