4.垃圾收集器
如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的的收集器。
这里讨论的收集器基于Sun HotSpot虚拟机1.6版,如上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。
4.1 Serial收集器
Serial收集器是最基本、历史最悠久的收集器,这个收集器是一个单线程的收集器,但她的单线程不仅仅是说明他只会使用一个CPU或一条收集线程去完成垃圾收集工作,更中亚的是是在他进行垃圾收集是,必须暂停其他所有的工作线程,直到他收集结束。
4.2 ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样,实现这两种收集器也共用了相当多的代码。
4.3 Parallel Scavenge收集器
Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点尽可能的缩短垃圾收集是用户线程的停顿时间,而ParallelScavenge收集器的目标则是达到一个可控制的吞吐量。所谓吞吐量就是CPU孕育运行用代码的时间与CPU总耗时间的比值,即/吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则可以更高效率的利用CPU时间。尽快的完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
4.4 Serial Old收集器
Serial Old是Serial收集器的老年代版本,他同样是一个单线程收集器,使用“标记—整理”算法。
4.5 Parallel Old收集器
4.6 CMS收集器
4.7 G1收集器