Java 常见的垃圾收集器有Serial GC、ParNew GC、CMS GC、Parallel GC、G1 GC:
- Serial GC:
- 优点:单线程精简的GC实现,无需维护复杂的数据结构,初始化简单,是client模式下JVM默认选项。最古老的GC。
- 缺点:会进入"Stop-The World"状态。
- ParNew GC:
- 新生代GC实现,是SerialGC的多线程版本,最常见的应用场景是配合老年代的CMS GC 工作
- CMS(Concurrent Mark Sweep)GC :
- 优点: 基于标记-清除(Mark-Sweep)算法,尽量减少停顿时间。
- 缺点: 存在碎片化问题,在长时间运行的情况下会发生full GC,导致恶劣停顿。会占用更多的CPU资源,和用户争抢线程。在JDK 9中被标记为废弃。
- Parrallel GC:
- 在JDK8等版本中,是server模式JVM的默认GC选择,也被称为吞吐量优先的GC,算法和Serial GC相似,特点是老生代和新生代GC并行进行,更加高效。
- G1 GC:
- 兼顾了吞吐量和停顿时间的GC实现,是Oracle JDK 9后默认的GC
- 可以直观的设值停顿时间,相对于CMS GC ,G1未必能做到CMS最好情况下的延时停顿,但比最差情况要好得多
- G1 仍存在年代的概念,使用了Region棋盘算法,实际上是标记-整理(Mark-Compact)算法,可以避免内存碎片,尤其是堆非常大的时候,G1优势更明显。
- G1 吞吐量和停顿表现都非常不错。