上一篇介绍了新生代垃圾收集器,接着说老年代垃圾收集器
Serial Old 收集器
Serial Old 是 Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法。它的主要意义也是在于给Client模式下的虚拟机使用。如果在Server模式下,主要有两大用途:其一是在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用。其二作为CMS收集器的后备预案,之后系列文章会单独说这个。
Parallel Old
Parallel Old 是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。吞吐量优先,工作过程如下图
CMS收集器
CMS(Concurrent Mark Sweep)收集器,以获取最短的GC停顿这目标。如果应用注重响应速度,希望系统停顿时间最短,CMS收集器很符合这样的场景,采用“标记-清除”算法。运作过程稍复杂,分为初始标记、并发标记、重新标记和并发清除。前两个步骤,仍会“Stop The Word”,但总体上来说,内存回收与用户线程是并发执行的。
CMS是一款优秀的收集器,特点是并发收集、低停顿。也存在缺点,如对CPU资源非常敏感。CMS收集器无法处理浮动垃圾,可能出现“Current Mode Failure”而导致 Full GC。(-XX:CMSInitiatingOccupancyFraction 参数适当提高,可降低内存回收次数,性能可提高。若过高容易导致 Concurrent Mode Failure)
另外,CMS采用标记-清除算法,会产生内存碎片。解决这个问题,它提供了一个-XX:+UseCMSCompactAtFullCollection开关参数,FullGC时开启碎片合并整理。-XX:CMSFullGCBeforeCompaction,这个参数是执行多少次不压缩的FullGC后,跟着来一次压缩的。
G1收集器
G1是一款面向服务端应用的垃圾收集器,是收集器技术发展的最前沿成果之一。特点如下
并行与并发:能充分利用多CPU、多核环境下的硬件优势,缩短了Stop The Word停顿时间。Java程序和垃圾收集可以并发执行。
分代收集:GC虽然可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式处理新创建的对象和旧对象,以获取更好的收集效果。
空间整合:从整体来看是基于“标记-整理”算法实现,从局部来看是基于“复制”算法来实现。动作期间不会产生内存碎片
可预测停顿:G1除了追求低停顿处,还能建立可预测的停顿时间模型,能让使用者指定一个长度为M毫秒的时间内,消耗在垃圾收集上的时间不得超过N毫秒。G1避免全在java堆栈的全区域进行垃圾回收,而是将堆栈划分为不同的区域(Region),跟踪各个Region里垃圾堆积的价值大小,在后台维护一个优先级列表。优先回收价值最大的Region,从而实现在有限的时间内,获取尽可能大的收集效率。
运作过程大致可以分为以下几步骤:初始标记、并发标记、最终标记、筛选回收