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 吞吐量和停顿表现都非常不错。