1. 新生代收集器
Serial
1. 单线程工作。
2. 工作时会暂停其他工作线程,直到它收集结束。
3. 触发严重的“stop the world”
4. 在垃圾收集时,采用复制算法进行垃圾收集
ParNew
1. 多线程工作。
2. 其他特性和Serial收集器一样。
3. 唯一一个可以与CMS收集器配合工作。(配置-XX:+UseConcMarkSweepGC使用CMS进行老年代垃圾收集,默认对应的新生代垃圾收集器就是ParNew)
4. ParNew是并行收集,CMS是并发收集。
并行:多条垃圾收集线程工作的时候,用户线程处于等待状态。
并发:用户线程和垃圾收集线程同时执行。
ParallelScavenge(可控的吞吐量)
ParallelScavenge的关注点是达到一个可控制的吞吐量。适用于后台运算。
CMS的关注点是尽量缩短垃圾收集时用户线程的停顿时间。适用于用户交互程序。
吞吐量:用户线程执行时间/(用户线程执行时间 + 垃圾收集时间)
2. 老年代收集器
CMS
步骤:
1. 初始标记
2. 并发标记
3. 重新标记
4. 并发清除
其中,
并发标记和并发清除,是允许用户线程和垃圾收集线程并发执行。不发生STW
初始标记和重新标记,需要暂停用户线程,会发生STW
缺点:
1. 使用CMS,由于是垃圾回收线程和用户线程并发执行,会导致应用程序变慢,吞吐量下降。
2. 产生一定的浮动垃圾。并发清理阶段,用户线程的运行会产生新的垃圾,这一部分垃圾是在标记阶段之后,
因此在当此收集过程中无法回收,只能放到下次垃圾收集。这一部分垃圾称为浮动垃圾。
3. 会产生大量的内存碎片
SerialOld(MSC)
ParallelOld
3. G1收集器
1. 支持并行(多cpu)和并发(收集线程和用户线程并发执行)
2. 分代收集(逻辑上的分代,物理上不连续的内存也可以是同一代)
3. 采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,
存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
4. 支持混合收集,新生代和老年代可以同时进行垃圾收集