Java学习笔记---垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
1、Serial收集器
Serial收集器是最基本、发展历史最悠久的收集器。这个收集器是一个单线程收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他工作线程,知道它收集结束。
特点:CPU利用率最高,停顿时间及用户等待时间长。
使用场景:小型应用(client应用)
2、ParNew收集器
ParNew收集器是Serial的多线程版本。
使用场景:server应用
3、Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间是CPU总消耗时间的比值,即吞吐量=运行用户代码时间 / (运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量及时99%。
特点:停顿时间短,回收效率高,对吞吐量要求高。
适用场景:大型应用、大规模数据采集等。
4、CMS(Concurrent Mark Sweep)收集器
CMS收集器是一种以获取最短收回停顿时间为目标的收集器。CMS收集器是基于“标记--清除”算法实现的,分为四个步骤:
(1)初始标记
(2)并发标记
(3)重新标记
(4)并发清除
初始标记、重新标记这两个步骤仍需要暂停用户线程。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
并发标记阶段就是GC Roots Tracing(查找不可用对象)的过程,而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间段。
由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是于用户线程一起并发执行的。
特点:并发收集、低停顿
使用场景:服务端应用
5、G1收集器
G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一。G1是一款面向服务端应用的垃圾收集器。
与其他GC收集器相比,G1具备如下特点:
(1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短用户线程停顿时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。
(2)分代收集:与其他收集器一样,分代概念在G1中依然得以保留。
(3)空间整合:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记--整理”算法实现的收集器。
(4)可预测的停顿:这是G1相对于CMS的另一大优势,建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。