JVM 垃圾回收器
简单列举了JVM中使用的集中垃圾收集器
新生代收集器
Serial
Serial收集器的机制被称为“Stop the word”。它属于单线程收集器,进行垃圾收集GC的时候会暂停所有的用户线程,采用复制算法进行GC。
这个收集器适用于Client端,因为它对于小内存的收集来说尤为高效,停顿时间也比较短。
ParNew
ParNew收集器同样是使用“Stop the word”机制。但是它是多线程的。如果是运行在多cpu的服务器上的时候,首选这种收集器。
Parallel Scavenger
这是一个吞吐量优先的垃圾收集器,采用多线程机制。
年老代收集器
Serial Old
和Serial相对应,是年老代收集器,使用单线程的和标记-整理算法进行垃圾回收。
Parallel Old
是Parallel Scavenge收集器的年老代版本。使用多线程和标记-整理算法,主要是服务端模式下和Parallel Scavenge收集器组合使用。
CMS(Current Mark Sweep)
CMS是对年老带的进行对象回收,这是一个额外的回收管理机制,基于标记-清除算法实现。它的特点是JVM的停顿时间较短(普通的年老代回收机制就有较长时间的JVM响应停顿),因此CMS主要可以应用于对响应时间有较高要求的服务器上。由于收集完成后会产生碎片,所以要开启 -XXUseCMSCompactAtFullCollection
开关参数,表示在Full GC之后,要进行一次碎片整理。开启CMS需要使用额外的参数启用它 :在启动JVM参数加上-XX:+UseConcMarkSweepGC
。
CMS的运作阶段
- 初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,Stop The Word。这个过程从垃圾回收的”根对象”开始,只扫描到能够和”根对象”直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
- 并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
- 并发预清理 :并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段”重新标记”的工作,因为下一个阶段会Stop The World。
- 重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从”根对象”开始向下追溯,并处理对象关联。
- 并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
- 并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。
G1(Garbage First)
G1将整个JAVA堆(包括新生代、老年代)划分为多个固定大小的独立区域,并跟踪垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,有限回收垃圾最多的区域。 它是基于标记-整理算法实现的,并且具有非常准确的控制停顿。
各个收集器的可用组合
图例表示了各个收集器组合可能性,如果两个收集器之间存在连线,表明他们可以一起组合使用。