点击查看更多JVM总结
文章目录
1.Serial垃圾收集器
Serial垃圾收集器是最早出现的新生代收集器。
- 作用域:新生代
- 使用算法:复制算法
- 线程数:单线程
- 特点:在垃圾收集的过程中,由于是单线程的,需要stop-the-world,即将用户线程停止。
2.ParNew垃圾收集器
ParNew垃圾收集器是Serial垃圾收集器的多线程版本,提高了多核CPU收集垃圾的效率。
- 作用域:新生代
- 使用算法:复制算法
- 线程数:多线程
- 特点:由于是多线程的,在垃圾收集过程中效率较高(针对多核CPU),所以stop-the-world的时间较短。
3.Parallel Scavenge垃圾收集器
Parallel Scavenge垃圾收集器和ParNew收集器相似,都是新生代多线程的垃圾收集器,但是Parallel Scavenge垃圾收集器的目标并不是简单地缩短stw的时间,而是提高代码执行吞吐量。代码执行吞吐量=运行用户代码的时间/(运行用户代码的时间 + 垃圾回收的时间)。
- 作用域:新生代
- 使用算法:复制算法
- 线程数:多线程
- 特点:以提高代码吞吐量为目的设计。
- 吞吐量控制:
-XX:MaxGCPauseMillis用于控制最大垃圾收集停顿时间
-XX:GCTimeRatio用于直接控制吞吐量的大小
4.Serial Old垃圾收集器
Serial Old垃圾收集器是Serial垃圾收集器的老年代版本,它和Serial垃圾收集器相似。
- 作用域:老年代
- 使用算法:标记-整理算法
- 线程数:单线程
- 特点:stw时间较长
5.Parallel Old垃圾收集器
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用标记-整理算法
- 作用域:老年代
- 使用算法:标记-整理算法
- 线程数:多线程
- 特点:以提高代码吞吐量为目的设计。
- 吞吐量控制:
-XX:MaxGCPauseMillis用于控制最大垃圾收集停顿时间
-XX:GCTimeRatio用于直接控制吞吐量的大小
6.CMS垃圾收集器
CMS(Concurrent Mark Sweep)垃圾收集器是一款优秀的老年代垃圾收集器,它采用并发技术和标记-清除算法。
- 作用域:老年代
- 使用算法:标记-清除算法
- 线程数:并发线程
- 特点:以缩短停顿时间为目的设计。
- 垃圾收集过程:
1)初始标记(GC线程单独运行):标记所有GC ROOTS 对象
2)并发标记(GC线程与用户线程并发运行):标记GC ROOTS 可达对象
3)重新标记(GC线程单独运行):用于重新标记在并发标记阶段新增的GC ROOTS可达对象
4)并发清理(GC线程与用户线程并发运行):将所有不可达的对象清理
7.G1垃圾收集器
G1垃圾收集器是JDK 1.7开始支持的一款垃圾回收器,在JDK 1.9中成为默认的垃圾回收器。它和CMS一样都是并行的,但是它以“Garbage First”为目标,而不分垃圾回收的区域。
- 作用域:新生代和老年代
- 使用算法:分代收集算法
- 线程数:并发线程
- 特点:垃圾收集为首要任务,将内存分割为许多块Region区域并用E(eden)、S(servivor)、O(old)和H去标记它们,只要满足了收集条件就立刻收集。
- 垃圾收集过程:
1)初始标记(GC线程单独运行):标记所有GC ROOTS 对象
2)并发标记(GC线程与用户线程并发运行):标记GC ROOTS 可达对象
3)重新标记(GC线程单独运行):用于重新标记在并发标记阶段新增的GC ROOTS可达对象
4)并发清理(GC线程与用户线程并发运行):将所有不可达的对象清理