JVM学习笔记三——垃圾收集器
上图是基于Sun的HotSpot虚拟机收集器,可以看到有7种收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。
在具体讲收集器之前,先明确两个概念:
1. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
2. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个CPU上。
下面我们来介绍一下这七种收集器
- Serial收集器
最基本、历史最悠久的收集器,是单线程的收集器,进行垃圾收集时,必须暂停其他所有的工作线程。 到现在为止:依然是虚拟机运行在Client模式下的默认新生代收集器,因为:简单而高效,另外在桌面应用下,停顿时间不超过1秒,只要不频繁发生,是可以接受的。 - ParNew收集器
是Serial收集器的多线程版本。 由于CMS作为老年代收集器,无法与Parallel Scavenge配合工作,所以在JDK1.5使用CMS收集器来收集老年代的时候,新生代只能选择ParNew或Serial收集器中的一个。 - Parallel Scavenge收集器
是一个新生代收集器,使用复制算法的收集器,又是并行的多线程收集器,此收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行 用户代码的时间和CPU总消耗时间的比值。 - Serial Old收集器
是Serial收集器的老年代版本,是一个单线程收集器,使用“标记-整理”算法。主要意义是在Client模式下的虚拟机使用,在Server模式下,有两大用途:(1)在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,另外一个是作为CMS收集器的后备预案。 - Parallel Old收集器
是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。 - CMS收集器
一种以获取最短回收停顿时间为目标的收集器。因为有一类应用重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。 此收集器是基于“标记-清除”算法实现的。整个过程分为4个步骤: (1)初始标记(2)并发标记(3)重新标记(4)并发清除
缺点:(1)对 CPU资源非常敏感 (2)无法处理浮动垃圾 (3)产生大量空间碎片 - G1收集器
当前收集器技术发展的最前沿成果。与CMS收集器相比有两个显著的改进:(1)基于“标记-整理”算法实现的收集器,因此不会产生空间碎片。(2)它可以非常精确地控制停顿。 G1收集器可以实现在基本不牺牲吞吐量的前提下完成低停顿的内存回收。