1,Serial Old 收集器(-XX: +UseSerialOldGC, 标记 - 整理算法)
1.1 单线程收集, 进行垃圾收集时, 必须暂停所有工作线程
1.2 简单高效, Client 模式下默认的老年代收集器
2,Parallel Od 收集器(-XX: +UseParallelOldGC , 标记 - 整理)
2.1 JDK6 之后才有这个收集器, 多线程, 吞吐量优先, 如果注重 CPU 资源和吞吐量的场合, 可以使用这个组合 Parallel Scavenge + Parallel Old 收集器
3,CMS 收集器(这个收集器, 占据了老年代收集器的半壁江山.-XX:+ UseConcMarkSweepGC , 标记 - 清除算法, 有碎片产生)
优点: 几乎可以和用户线程做到同时工作, 本质还是要 STOP-THE WORLD, 只是停顿时间短
如果在老年代中存活更多存活率高的对象, 使用 CMD 收集器更适合
收集流程:(一边掉垃圾一边打扫)
初始标记: stop-the-world, 从垃圾回收的根对象开始, 只是扫描和根对象有关联的对象并做标记. 虽然暂停了所有的线程工作, 但是停顿时间很短.
并发标记: 并发追随标记, 程序不会停顿
并发预清理: 查找执行并发标记阶段从年轻代晋升到老年代的对象
重新标记: 暂停虚拟机, 扫描 CMS 堆中的剩余对象
并发清理: 清理垃圾对象, 程序不会停顿
并发重置: 重置 CMS 收集器的数据结构
4,G1 收集器(-XX:+UseG1GC , 复制 + 标记 - 整理算法)
Garbage First 收集器的特点
4.1 并发和并行
4.2 分代收集
4.3 空间整合
4.4 可预测的停顿
说明: 这个收集器的内存布局与其他收集器有很大区别
将整个 JAVA 堆内存划分成多个大小相等的 Region
年轻代和老年代不再物理隔离
额外知识: JDK11 有 Epsilon GC 和 ZGC (研发阶段)
问题: 为什么年轻代中的 Parallel Scavenge 收集器不能和老年代中的 CMS 收集器一起工作呢?
---》因为 Parallel Scavenge 收集器 (G1) 都没有使用传统的 GC 收集器代码框架, 都是另外独立开发的.
而 Serial,parNew,CMS 都有使用了部分相同的收集器代码框架, 所有他们三个是兼容的.
(CMS 是 hotsport 在 jdk5 才出来的真正意义上是并行收集器, 第一次让垃圾收集线程和用户线程一起工作.)
来源: http://www.bubuko.com/infodetail-3013026.html