前面既然说了JVM的集中垃圾回收集器的算法,那么现在可以来看一下垃圾收集器了。如果说垃圾收集器算法是方法论,那么
垃圾收集器就是内存回收的具体实现。
这里主要讨论的是jdk1.7以后的HotSpot虚拟机,采用G1收集器。
上图展示了7个不同分代收集器,如果两个收集器间存在连线,就说明他们之间可以搭配使用。虚拟机所在的区域,则表示它们属于新生代收集器还是老年代收集器。 接下来逐一介绍这个7个垃圾收集器
Serial
是最基本,历史最悠久的收集器,是一个单线程的收集器当它进行垃圾回收时,所以其他的线程都必须暂停,直到它收集结束。
优点:简单而高效
ParNew
其实就是Serial多线程的版本,除了可以使用多个线程以外,其余和Serial用法完全一样。
Parallel Scavenge
是一个新生代收集器,也是使用复制算法的收集器,又是并行的多线程收集器。可以达到一个可控的吞吐量,高效率的利用cpu时间,尽快完成运算任务。
Serial Old
老年代版本的收集器,也是一个单线程的收集器是使用标记-整理算法实现的。
Parallel Old
老年代版本收集器,使用多线程标记-整理算法,是一个多线程的收集器
CMS
一种以获取最短回收停顿时间为目标的收集器,CMS基于标记-清除算法实现的。
包含
初始化标记
并发标记
重新标记
并发清除
优点:并发收集、低停顿。
缺点:对CPU资源敏感,在并发过程中占用CPU资源,导致程序变慢,吞吐量降低
无法处理浮动垃圾。由于并发清理的用户还在产生新垃圾 ,这部分垃圾出现在标记之后,所以这次清理无法清理,必须等到下一次GC清理
基于标记-清除的算法实现的,所以在清除垃圾之后会有大量的空间碎片。
G1收集器
是一款面向服务端应用的垃圾收集器,具备一下特点
并行和并发 :G1能充分利用多CPU,多核环境的硬件优势,使用多个CPU来缩短停顿的时间,部分收集器原本需要停顿java线程去执行GC动作,G1收集器通过并发的方式让java程序继续执行
分代收集:与其他收集器一样,分代的概念在G1中保留。
空间整合:G1从整体看是基于标记-清理 ,从局部看是基于复制算法实现的。G1运行期间不会产生空间碎片。
可预测的停顿:这是G1对于CMS的一大优势,G1除了追求低停顿以外,还能建立停顿时间模型,能让在指定长度的M毫秒时间段内,消耗垃圾收集器 上的时间不得超过N毫秒。
G1之所以能建立停顿时间模型,是因为它可以有计划的避免整个Java堆中进行全区域的垃圾收集。
G1收集器大致分为一下几步
初始化标记
并发标记
最终标记
筛选回收