垃圾回收算法是垃圾回收的方法论,而垃圾收集器是垃圾回收的具体实现。下面介绍基于JDK1.7后的G1收集器之后的HotSpot虚拟机,该JVM包含的所有收集器如下:
1.新生代收集器:Serial、ParNew、Parallel Scavenge
2.老年代收集器:CMS、Serial Old、Parallel Old
3.全区域垃圾收集器:G1
Serial收集器是JDK1.3提供
Serial收集器是最基本、发展历史最悠久的收集器,在JDK1.3以前是虚拟机新生代垃圾收集器的唯一选择。
Serial是一个单线程的垃圾收集器,在Serial进行垃圾回收时暂停所有的用户线程,直到Serial收集器的GC线程结束
Serial收集器是虚拟机运行在Client模式下的默认新生代收集器
对于其他收集器的单线程来说,Serial收集器简单而高效;
对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,可以获得更高的单线程收集效率。
ParNew收集器是JDK1.4提供
ParNew收集器相当于Serial收集器的多线程版本,除了使用多条线程进行垃圾收集外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器一样
ParNew收集器是Serial收集器的多线程版本
ParNew收集器是许多运行在Server模式下的虚拟机中的首选的新生代收集器,之所以作为Server首选收集器与性能无关的重要原因是:除了Serial收集器外,目前只有ParNew收集器与老年代收集器中的CMS收集器配合工作。
与Serial收集器相比,ParNew收集器在单个CPU的环境下,由于存在线程交互的开销,没有Serial收集器的效果好。
然而随着使用CPU的数量的增加,ParNew收集器对于GC时系统资源的有效利用有较大的优势。
Parallel Scavenge收集器是JDK1.4提供
Parallel Scavenge收集器作为新生代收集器,使用的垃圾回收算法是复制算法,是并行的多线程收集器。
Parallel Scavenge收集器使用两个参数控制吞吐量:
1.XX:MaxGCPauseMilis —-> 控制最大的垃圾回收停顿时间
2.XX:GCRatio ——> 设置吞吐量的大小
注:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾回收时间)
停顿时间越短就越适合与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量的效果就是如此,故Parallel Scavenge收集器合适高吞吐量的场景。
与ParNew收集器相比,Parallel Scavenge收集器具有自适应调节策略。
GC自适应调节策略:
Parallel Scavenge收集器有一个参数-XX:+UseAdaptiveSizePolicy.当这个参数打开之后,就不需要手工指定新生代的大小、Eden区与Survivor区的比例、晋升老年代对象年龄等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态地调整这些参数以提供最合适的停顿时间或者最大吞吐量,这种调节方式称之为GC自适应调节策略。
Serial Old收集器是JDK1.5提供
Serial Old收集器是Serial收集器的老年代版本,单线程收集器,采用标记-整理算法
1.在Client模式下,Serial Old收集器主要在于给Client模式下的虚拟机使用
2.在Server模式下:Serial收集器主要作为CMS收集器的后备预案,当CMS收集器发生并发失败问题时使用
Parallel Old收集器是JDK1.6提供
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,是一个多线程收集器,采用标记-整理算法进行垃圾回收
在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge收集器+Parallel Old收集器
CMS(Concurrent Mark Sweep)收集器是JDK1.5提供
CMS收集器是一种以获取最短回收停顿时间为目标的收集器,由于目前大大部分Java应用集中在互联网站或者B/S系统的服务端,而这类应用尤其重视服务的响应速度,希望系统停顿时间最短,给用户带俩=来较好的体验,故CMS收集器符合这类应用的需求。
CMS收集器是基于标记-清除算法实现的,它的工作流程分为以下几个步骤:
1.初始标记(CMS initial mark):初始标记仅仅标记GC Roots能直接关联到的对象,速度很快,需要Stop The World
2.并发标记(CMS concurrent mark):并发标记阶段就是进行GC Roots Tracing的过程
3.重新标记(CMS remark):重新标记阶段是为了修正并发标记阶段因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录
4.并发清除(CMS concurrent sweep):并发清除阶段进行清除对象
1.优点:并发收集,低停顿
2.缺点:CMS收集器对CPU资源敏感,CMS收集器无法处理产生的大量空间碎片
G1收集器是JDK1.7提供
G1(Garbage-First)收集器是一款面向服务端应用的垃圾收集器,HotSpot开发团队赋予它的使命是未来可以替换掉JDK1.5中提供的CMS收集器。
如果应用追求低停顿,G1可以作为选择;如果应用追求高吞吐量,G1并不会带来什么明显的好处
G1垃圾回收器是用在heap memory很大的情况下,把heap划分为很多region块,然后并行的对其进行垃圾回收。
G1垃圾回收器在清除实例对象所占用的内存空间后,还会进行内存压缩。
G1垃圾回收器从整体来看是基于标记-整理算法,从局部(两个region块之间)来看是基于复制算法。