HotSpot 的 GC

wiki

JVM 在进行 GC 设计时,会假设大多数的对象寿命周期都很短,GC 要尽快进行回收,其 4 种 GC 都是基于分代回收的:

  • 串行 GC
  • 并行 GC
  • CMS GC
  • G1 GC

1. 串行 GC

HotSpot 会使用单线程来进行垃圾回收。一般在服务器应用中不会使用。

  • 适用 : 仅有单个处理器的计算器,或者是对 GC 效率没有要求,且空间较小(如:小于 100M)的 Java 应用比较有效
  • 缺点 : GC 时,会冻结所有的应用程序线程
  • 使用 : -XX:+UseSerialGC

2. 并行 GC

与串行相比,采用多线程垃圾回收

  • 缺点 : GC 时,会冻结所有的应用程序线程
  • 使用 : -XX:+UseSerialGC

3. CMS GC

CMS(concurrent-mark-sweep),也是一种并行 GC,但分为多个阶段处理,进行 GC 时,它会使用多个线程(concurrent)在堆中扫描被标记( mark) 的对象,然后进行清理(sweep)。它使用的是并发标记清理算法。

  • 适用 : 一些长时间运行服务器应用,且堆内存小于 4GB
  • 使用 : -XX:+UseConcMarkSweepGC

4. G1 GC

G1(Garbage First),垃圾优先 GC,并发收集器,会利用多个后台线程来扫描堆,但和其他 GC 不同的是,它将堆内存划分为多个大小相等的 region。每个 region 可以在 1M - 32M,region 的具体大小取决于Heap的大小。

  • 使用 : -XX:+UseG1GC

参考

斜杠代码日记-Java 8 HotSpot必知的4种GC