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