总:HotSpot虚拟机用到的垃圾回收器如下图所示。连线代表可以搭配使用
两种分类:
| {串行回收器:Serial. Serial Old 并行回收器:ParNew. Parallel Scavenge. Parallel Old 并发回收器:CMS. G1(分区算法)} | {新生代收集器: Serial、 ParNeW、Parallel Scavenge; 老年代收集器: Serial Old、 Parallel Old、 CMS; 整堆收集器: G1;} |
一.串行垃圾回收器
1.Serial:是最基本、历史最悠久的垃圾收集器,是HotSpot虚拟机运行在客户端模式下的默认新生代收集器。是 一个单线程收集器,它只会使用一条垃圾收集线程去完成垃圾收 集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。
- 优点:简单高效,额外内存消耗小
- 缺点:stop the world
- 是默认新生代收集器的原因:管理内存不大,停顿时间也不长
2.Serial Old:Serial收集器的老年代版本。
- 应用场景:主要用于Client模式, 而在Server模式有两大用途:
-
在JDK1.5及之前,与Parallel Scavenge收集器搭配使用(JDK1.6有Parallel Old收集器可搭配);
作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
-
二. 并行垃圾回收器
1.ParNew:是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为和Serial收集器完全一样。它是许多运行在Server模式下的虚拟机的首要选择,除了Serial收集器外,只有它能与CMS收集器配合工作。
- 补充并行和并发:
-
并行(Parallel) :多条垃圾收集线程并行工作,用户线程处于等待状态。
并发(Concurrent):用户线程与垃圾收集线程同时执行(但不一定是并行,可能会交替执行),程序能响应服务请求,但由于垃圾收集器线程占用一部分资源,应用程序的吞吐量会被影响
-
2.Parallel Scavenge(吞吐量优先收集器):Parallel Scavenge收集器目标是达到可控制的吞吐量(高效率的利用CPU)。(吞吐量=运行用户代码时间/(运行用户代码时间+运行垃圾收集时间))
- Parallel Scavenge提供三个参数控制吞吐量:
- 最大垃圾收集停顿时间-XX:MaxGCPauseMillis(大于0的毫秒数,收集器将尽可能地保证内存回收花费的时间不超过设定值。不是设得越小越快,GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的)
- 吞吐量大小-XX:GCTimeRatio(大于0且小于100的整数)
- 开关参数-XX:+UseAdaptiveSizePolicy(当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC自适应的调节策略(GC Ergonomics)。)
3.Parllel Old:Parallel Old垃圾收集器是Parallel Scavenge收集器的老年代版本;JDK1.6中才开始提供;
- 应用:
-
JDK1.6及之后用来代替老年代的Serial Old收集器( 特别是在Server模式,多CPU的情况下)
在注重吞吐量以及CPU资源敏感的场景,有Parallel Scavenge加Parallel Old收集器的"给力"应用组合;
-
三.CMS垃圾回收器(并发低停顿收集器)(Concurrent Mark Sweep):CMS收集器是一种以获得最短回收停顿时间为目标的收集器,从名字看知道是标记-清除算法
- 分为4个阶段,时间长短由大到小:24>3>1:
-
1.初始标记:标记一下GC Roots能直接关联到的对象,会“Stop The World”。
2.并发标记:GC Roots Tracing,遍历整个对象图,可以和用户线程并发执行。
3.重新标记:对因在用户程序运行期间而导致标记变动的那部分对象再判断,会“Stop The World”。
4.并发清除:清除对象,可以和用户线程并发执行。
-
- 优缺点:
| 优点:并发收集、低停顿。 | 缺点:1.对CPU资源敏感; 2.无法处理浮动垃圾; 3.它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。 |



