3、Parallel Scavenge收集器
(1)概述:一个新生代收集器,使用复制算法,并行的多线程收集器。
(2)目标:达到一个可控制的吞吐量。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
4、CMS收集器
(1)概述:Concurrent Mark Sweep,基于“标记—清除”算法实现。整个过程分为4个步骤:
a、初始标记
b、并发标记
c、重新标记
d、并发清除
其中,初始标记、重新标记仍然需要“S-T-W”。初始标记仅仅是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing 的过程,而重新标记阶段是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分的标记记录。
(2)目的:获取最短回收停顿时间。
(3)优点:并发收集、低停顿。
(4)缺点:a、CMS收集器对CPU资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量降低。
b、CMS收集器无法处理浮动垃圾。CMS并发处理阶段用户线程还运行着,伴随程序运行还有垃圾产生过,这一部分垃圾出现在标记过程之后,CMS无法再当次收集中处理掉。
c、“标记—清除”算法,收集结束时会产生大量空间碎片。
5、G1收集器
(1)概述:当今收集器计数发展最前沿成果之一,是一款面向服务端应用的垃圾收集器。运作步骤:
a、初始标记
b、并发标记
c、最终标记
d、筛选回收
(2)特点:a、并行与并发:G1能利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短S-T-W停顿时间 b、分代收集
c、空间整合:整体上基于“标记—整理”算法,局部上看是“复制”算法实现的。运行期间不会产生内存空间碎片。
d、可预测的停顿。
(3)G1之前其他收集器进行收集的范围都是整个新生代或者老年代。使用g1收集器时,Java对内存布局与其他收集器有很大差别,将整个Java堆划分为多个大小相等的独立区域(Region)。
G1有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许收集时间,优先回收价值最大的Region。
参考文献
【1】《深入理解Java虚拟机》 机械工业出版社 周志明