备注:基于JDK1.7 Update 14之后的版本。
Serial收集器
Serial收集器是最根本、倒退历史最悠久的收集器,在JDK1.3.1之前是虚拟机新生代收集的惟一抉择。Serial收集器是一个单线程的收集器,须要留神的是这里的“单线程”并不仅仅阐明它只会应用一个CPU或一条收集线程去实现垃圾收集工作,而是它在进行垃圾收集时,必须暂停其余所有的工作线程,直到收集完结。即Stop The World。收集器运行过程如下:
特点:
简略高效,对于限定单个CPU的环境来说,Serial收集器因为没有线程交互的开销,分心做垃圾收集,天然能够取得最高的单线程收集效率。实用于运行在Client模式下的虚拟机。
ParNew收集器
ParNew收集器时Serial收集器的多线程版本,除了应用多条线程进行垃圾收集之外,其余的行为都与Serial收集器齐全一样。ParNew收集器的示意图如下:
ParNew收集器实用于运行在Server模式下的虚拟机的新生代收集器。并且它可能与CMS收集器配合工作。
Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代收集器,应用的时复制算法,是并行的多线程收集器。Parallel Scavenge收集器的指标是达到一个可管制的吞吐量。吞吐量指的是CPU用于运行用户代码的工夫与CPU总耗时工夫的比值,即:
吞吐量 = 运行用户代码工夫 / (运行用户代码工夫 + 垃圾收集工夫)。
比方,虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,吞吐量就是99%。
进展工夫越短就越适宜须要与用户进行交互的程序,良好的响应速度能晋升用户体验,而高吞吐量则能够高效地利用CPU工夫,尽快实现程序的运算工作,次要实用于后盾运算而不须要太多交互的工作。
Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,应用“标记—整顿”算法。示意图如下:
该收集器也是给Client模式下的虚拟机应用。如果是在Server模式下,还能够有两个用处:
- 在JDK1.5以及之前版本中与Parallel Scavenge收集器搭配应用;
- 作为CMS收集器的后备预案,在并发收集产生Concurrent Mode Failure时应用。
Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,应用多线程和“标记—整顿”算法。示意图如下:
CMS收集器
CMS收集器是一种以获取最短回收进展工夫为指标的收集器。是基于“标记—革除”算法实现的。它的运作过程分为4个步骤:
- 初始标记
初始标记须要“Stop The World”。初始标记仅仅只是标记一下GC Roots能间接关联到的对象,速度很快。 - 并发标记
并发标记阶段就是进行GC Roots Tracing的过程。 - 从新标记
从新标记阶段须要“Stop The World”。该阶段是为了修改并发标记期间因用户程序持续运作而导致标记产生变动的那一部分对象的标记记录,这一阶段的进展工夫个别会比初始标记阶段稍长一些,但比并发标记的工夫短。 - 并发革除
该阶段是对被标记的对象进行革除,回收内存。
示意图如下:
长处:并发收集,低进展。
毛病:
- CMS收集器对CPU资源十分敏感。
- CMS收集器无奈解决浮动垃圾,可能呈现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。在JDK1.5的默认设置下,CMS收集器当老年代应用了68%的空间后就会激活,如果在利用中老年代增长不是太快,能够适当调高参数-XX:CMSInitiatingOccupancyFraction的值来进步触发百分比,以便升高内存回收次数从而取得更好的性能。在JDK1.6中,CMS收集器的启动阈值曾经晋升至92%。
- CMS是基于“标记—清理”算法实现的,收集完结时可能会有大量碎片空间产生。空间碎片过多时,将会给大对象的调配造成很大的麻烦,往往会呈现老年代还有很大的残余空间,然而无奈调配以后对象,不得不提前触发一次Full GC。为了解决这个问题,CMS收集器提供了一个开关参数:-XX:+UseCMSCompactAtFullCollection,该参数默认是开启的,用于在CMS顶不住要进行Full GC是开启内存碎片的合并整顿过程。
G1收集器
G1(Garbage-First)收集器是一款面向服务端利用的垃圾收集器。具备如下特点:
- 并行与并发
- 分代收集
- 空间整顿
- 可预测的进展
G1收集器将整个Java堆划分为多个大小相等的独立区域(Region),尽管还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,他们都是一部分不须要间断的Region的汇合。
在G1收集器中,Region之间的对象援用以及其余收集器中的新生代与老年代之间的对象援用,虚拟机都是应用Remembered Set来防止全堆扫描。G1中每一个Region都有一个与之对应的Remembered Set,虚拟机发现程序在Reference类型的数据进行写操作时,会产生一个Write Barrier临时中断写操作,查看Reference援用的对象是否处于不同的Region之中,如果是,便通过CardTable把相干援用信息记录到被援用对象所属的Region的Remembered Set即可保障不对全堆扫描也不会有脱漏。
G1收集器的运作大抵可划分为以下几个步骤:
- 初始标记
初始标记阶段仅仅只是标记一下GC Roots能间接关联到的对象,并且批改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运作时,能在正确可用的Region中创立新对象,这一阶段须要进展线程,但耗时很短。 - 并发标记
并发标记阶段是从GC Root开始对堆中的对象进行可达性剖析,找出存活的对象,这一阶段耗时较长,然而能够和用户线程并发执行。 - 最终标记
最终标记是为了修改在并发标记期间因用户程序继续执行而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变动记录在线程Remembered Set Logs外面,最终标记阶段须要把Remembered Set Logs的数据合并到Remembered Set中,这一阶段须要进展线程,然而能够并行执行。 - 筛选回收
筛选回收阶段首先对各个Region的回收价值和老本进行排序,依据用户所冀望的GC工夫来指定回收打算。
G1收集器的运行示意图如下: