垃圾收集器
- 垃圾收集算法是内存回收的方法论
- 垃圾收集器就是内存回收的具体实现
Serial收集器
Serial收集器是最基本、发展历史最悠久的收集器,曾经是虚拟机新生代收集的唯一选择
这个收集器是一个单线程收集器,但它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程区完成垃圾收集工作,更重要的是在于它进行垃圾收集时,必须暂停其它所有工作线程,直到它收集结束
使用复制算法
“Stop The World”这项工作实际上是由虚拟机在后台自动发起和自动完成的。在用户不可见的情况把用户正常工作的线程全部停掉,这对很多引用来说都是难以接受的,如下是Serial/Serial Old收集器的运行过程
Serial虚拟机依然是虚拟机运行在Client模式下的默认新生代收集器。它也有优于其他收集器的地方:简单而高效(与其它收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代(仅仅是新生代使用的内存,桌面应用基本上不会再大了),停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只要不是频繁发生,这点停顿是可以接受的,所以,Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择
ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本,采用的复制算法,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配原则、回收策略都与Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。ParNew收集器工作过程如图:
ParNew收集器除了多线程收集外,其它与Serial收集器相比并没有太多创新之处,但它确实许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关的很重要的原因是:
- 除了Serial收集器外,目前只有它能与CMS收集器配合工作。
在JDK1.5时期,HotSpot推出了一款在强交互应用中几乎可认为具有划时代意义的垃圾收集器-----CMS收集器(Concurrent Mark Sweep),这款收集器是HotSpot虚拟机中第一款真正意义上的并发(Concurrent)收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作
不幸的是,CMS作为老年代的收集器,却无法与JDK 1.4.0中已经存在的新生代收集器Parallel Scavenge配合工作,所以在 JDK 1.5中使用CMS来收集老年代的时候,新生代只能选择ParNew或者Serial 收集器中的一个。ParNew收集器也是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。
ParNew收集器在单CPU的环境中绝对不会有比 Serial收集器更好