JVM学习笔记(五)
上一张章学习了垃圾收集的几种算法,其中包括了最基础的“标记-清除”算法,复制算法,标记-整理算法,分代收集算法。以及这几种算法的优缺点。这一章来学习垃圾收集器。
收集算法是内存回收的方法论,而垃圾收集器是内存回事的具体实现。。。
由于java虚拟机规范对垃圾收集器的实现没有规定,不同厂商,不同版本的虚拟机提供的垃圾收集器也不同。这里学习讨论用到的虚拟机是 HotSpot 1.6版本 update 22,
这个虚拟机包含的垃圾收集器如下图。
如果两个收集器之间存在连线。说明他们可以配合使用。
1.Serial 收集器
Serial 收集器是最基本,年底最久远的收集器,在jdk1.3之前是虚拟机新生代收集唯一的选择。它是一个单线程的收集器。它的单线程不仅仅是说明只使用一个CPU
或一条收集线程去完成垃圾回收,更重要的是它进行垃圾回收时,必须暂停其他所有的工作线程,直到收集结束。相当于玩一个小时电脑。。停顿五分钟。。
优点:简单而高效(与其他收集的单线程相比),对应限定单个CPU的环境来说,serial收集器没有线程交互的开销,专心做垃圾收集,自己可以获得最高的收集效率。
2.ParNew 收集器
ParNew 收集其实是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括serial收集器可用的所有控制参数,收集算法,stop the world ,对象分配规则,
回收策略都跟serial 收集器是一样的。pernew收集器除了多线程收集之外,其他地方与serial收集相比,并没有创新的地方,但他却是许多server模式下的虚拟机的新生代收集器的首先,根本
原因是:强大的CMS老年代收集器,只有 parNew收集器,serial收集器才能与之配合、
3.Parallel Scavenge 收集器
Parallel Scavenge 也是一个新生代收集器,使用的也是复制算法,也是并行的多线程收集器。看上去跟parnew收集器一样,但是他关注的点与其他收集器不一样。
他的目标的是达到一个可控制的吞吐量。(吞吐量:CPU用于运行用户代码的时间与CPU总消耗时间的总值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总运行花了
100分钟,其中垃圾收集花了1分钟,那么吞吐量就是99%)。
停顿时间越短,就越适合与用户交互的程序,良好的响应时间能提升用户体验。
而高吞吐量则可以最高效率利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
4.