笔者首先会使用到的工具:
有几种不同的垃圾收集器,不同收集器各自有各自的收集对象以及收集策略;
Serial + Serial Old 收集器:两者都是串行收集器;Serial 收集器用于新生代的 Minor GC,单线程的 STW GC;Serial Old 收集器用于旧生代,单线程的 STW Full GC;
ParNew 收集器是Serial 收集器的多线程版本,用于新生代的 GC,通常与 CMS 收集器搭配使用。
Parallel Scavenge + Parallel Old 收集器,两者都是并行收集器,且都是强调 GC 时间的垃圾收集器。可以通过设置垃圾收集的比率 (程序时间 / (程序时间 + GC 时间)),或者 GC 最大时间,来保障 GC 时间不会过长。但这样也牺牲了新生代空间大小,以及吞吐量大小。
参考地址:《GC之详解CMS收集过程和日志分析》
CMS (Concurrent Mark Sweep) 收集器用于旧生代,它的设计目的是为了减少回收时间。为了实现这一目的,首先 CMS 用了列表数据结构,用来管理回收可利用空间;另外 GC 线程与用户线程并行处理(即 GC 过程中也会同时执行服务逻辑)。CMS 收集器使用标记-清除算法,步骤如下:
CMS 收集器虽然使用了标记-清除算法,可能会出现大量的内存碎片,但可以通过设置虚拟机参数,使得在 Full GC 之后执行空间压缩合并,清理内存碎片。
G1 收集器是一种新式的收集器,对旧生代、新生代没有明确的区分对待,因为它将堆内存划分为若干个 Region,旧生代和新生代与之前的定义不同,物理上不再隔离。标记清除的步骤和 CMS 收集器相似。
注:GC 机制见《JVM技术总结之二——GC机制》。