1. Serial(串行)收集器
单线程,串行,gc时会Stop The World,新生代采用复制算法,暂停所有用户线程。新生代收集器
2. ParNew(并行)收集器
ParNew收集器就是Serial收集器的多线程版本。新生代收集器
3. Parallel Scavenge 收集器
是一个新生代的收集器,目的是达到一个可控制的吞吐量,所谓的吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值
即吞吐量=运行用户代码时间 /(运行用户代码时间+GC时间),例如总共运行了100分钟,垃圾收集用了1分钟,那么吞吐量就是99%
吞吐量 = 99 / 100
4. Serial Old(串行)收集器
是Serial收集器的老年代收集器,使用标记-整理算法。
5. Parallel Old 收集器
是Parallel Scavenge 收集器的老年代收集器,使用多线程和标记-整理算法
6. CMS 收集器
CMS收集器是基于“标记-清除”算法实现的,整个流程不像“标记-清除”算法那样。有下面几个步骤
- 初始标记 stop the world 此步骤仅仅是标记GC Roots能直接关联到的对象,速度很快
- 并发标记 此步骤就是进行GC Roots Tracing的过程,
- 重新标记 stop the world 此步骤是为了修正并发标记期间用户程序继续运行所导致的标记变动的那一部分标记记录,这个阶段的停顿时间比“初始标记”时间长,比“并发标记”时间短
- 并发清除
优点:并发收集,低停顿
缺点
- 并发占用资源 由于并发,所以会占用一部分线程(CPU和用户资源),导致应用程序变慢,默认启动回收的线程数是(CPU数量+3)/4,CPU数量越多,占用的资源也就越小,
- 无法处理浮动垃圾 浮动垃圾就是在CMS收集器GC阶段,用户的线程还在运行,产生垃圾,这部分垃圾是不会在本次GC处理掉,要等到下一次的GC才可以清理。所以CMS收集器不会等到老年代块满的时候去执行,一般会预留一些空间,达到大小就触发GC。如果预留空间无法满足,就是说在CMS的时候,还没清除,但是用户新生成的垃圾把老年代占满,出现“Concurrent Mode Failure” 错误,这个时候就会触发Serial Old(串行)收集器,来对老年代重新进行回收,这是的时间就很长了。
- 内存碎片过多 由于CMS收集器是基于“标记-清除”算法,所以GC过后会有很多内存碎片。如果分配大对象的时候,无法找到连续空间来分配的话,会提前触发Full GC,jdk提供了参数 -XX:+UseCMSCompactAtFullCollection开关参数,默认开启的,来合并整理碎片。
7. G1 收集器
- 并行并发
- 分代收集
- 空间整合
- 可预测停顿