**摘要:**如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是具体实现。
总共有七种作用于不同分代的收集器,如果两个收集器之间存在连线,则可以搭配使用。
接下来介绍其特性、基本原理和使用场景。
没有做好的收集器,只有最适合的。
一、Serial收集器
是一个单线程的收集器,不仅说明它会使用一个CPU或一个收集线程去完成垃圾回收,更重要的是,它进行垃圾回收时,必须暂停其他所有工作线程,“Stop The World”。’
是在虚拟机运行在Client模式下的默认新生代收集器,简单而高效,限定单个CPU环境来说,没有线程交互的开销,可以获得最高的单线程手机效率,在用户的桌面应用场景中,分配给虚拟机管理的内存一般不大,停顿时间完全可以在100毫秒内,是可以接受的;
- 适合运行都在Client模式下的虚拟机。
二、ParNew收集器
- 是Serial收集器的多线程版本,除了使用多线程收集垃圾,其余都差不多一样;
- 是许多运行在Server模式下的虚拟机的首选新生代收集器;
- 除了Serial收集器,目前只有它能与CMS收集器配合工作,
是使用 -XX:+UseConcMarkSweepGC选项后的默认新生代收集器;
也可使用 -XX:+UseParNewGC强制指定; - 默认开启手机线程数与CPU一样,可以使用 -XX:ParallelGCThreads参数限制垃圾回收的线程数;
三、Parallel Scavenge收集器
-
是一个新生代收集器,使用的复制算法,多线程的收集器;
-
此收集器的目的和其它收集器不一样,CMS等收集器主要关注点是尽可能缩短垃圾回收时用户线程的停顿时间,而此收集器主要目标是达到一个可控制的吞吐量,由此可以高效率的利用CPU时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务;
-
两个参数精确控制吞吐量;
1、控制最大垃圾手机停顿时间: -XX:MaxGCPauseMillis 大于0的毫秒数2、直接设置吞吐量大小: -XX:GCTimeRatio 大于0且小于100的整数,也就是垃圾回收时间占总时间的比率,相当于是吞吐量的倒数。比如设为19,那就是允许最大时间占总时间的5%(1/(1+19));
-
是一个吞吐量优先的收集器,参数 -XX:+UseAdaptiveSizePolicy 是一个开关参数,打开后就不用手工指定新生代的大小、Eden与Survivor的比例,晋升老年代对象大小等细节参数了,虚拟机会自动调整,这种调节方式成为GC自适应的调节侧罗;
四、Serial Old收集器
- 是Serial收集器的老年代版本,单线程的使用“标价-整理”算法;
- 主要给Client模式下的虚拟机使用;
- 在JDK1.5以及之前与Parallel Scavenge使用;
- 作为CMS收集器的后备预案;
五、Parallel Old 收集器
- 是Parallel Scavenge的老年代版本,使用多线程的"标记-整理"算法,JDK1.6开始提供
- 在注重吞吐量以及CPU资源的敏感场合,可以优先考虑Parallet Scavenge加Parallel Old收集器;
六、CMC收集器
以获取最短回收停顿时间为目标的收集器,是基于“标记-清除”算法实现的,分为四个过程:
- 初始标记(Stop the world):只是标记GC Roots能直接关联的对象,速度很快;
- 并发标记:进行GC Roots Tracing的过程,可与用户程序并发执行。
- 重新标记:(Stop the world)修正并发标记期间用户程序继续运作而导致标记产生变动的一部分对象的标记
- 并发清除 :可与用户程序并发执行。
有如下三个缺点:
- 对CPU资源很敏感,并发阶段占用一部分资源,导致程序变慢,总吞吐量降低,默认启动的回收线程数是: (CPU数量+3)/4
- 无法处理浮动垃圾,可能出现"Concurrent Mode Failure”导致Full GC,虚拟机启用Serial Old收集器重新进行老年代的垃圾收集,停顿时间会很长;
- 是一款“标记-清除”算法实现的收集器,会有大量碎片产生,给分配大对象带来麻烦,无法找到连续空间而出发FullGC;
七、G1收集器
有以下特点:
- 并行与并发
- 分代收集:不需要与其他收集器配合级就能管理整个堆;
- 空间整合: 整体看是“标记-整理”算法实现的,从局部(两个Region之间)看则是基于“复制”算法实现的,不会产生内存碎片
- 可预测的停顿:相对于CMS的一大优势,除了追求地停顿,还能建立可预测的停顿时间模型,能让使用者指定在M毫秒的时间内,消耗在垃圾回收的时间为N毫秒;
G1收集器,Java堆的内存布局与其他收集器不同,将堆划分为多个大小相等的独立区域(Region);
G1收集器的大致运作:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收