目录
1. 垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。以下讨论Update 14之后HotSpot虚拟机的垃圾收集器。
以上图示展示了7中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。
1.1 Serial收集器
Serial收集器时最基本的、发展历史最悠久的收集器。这个收集器时一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。可想而知,如果你的计算机运行一小时就会暂停5分钟是什么心情?
1.2 ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本。
再此之后会涉及到两个名词:并发和并行,此处解释如下:
- 并行(Parallel):指多条垃圾收集线程并行工作,但是此时用户线程仍然处于等待状态。
- 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行与另一个CPU上。
1.3 Parallel Scavenge收集器
它使用复制算法,又是并行的多线程收集器。特点是它的关注点与其他收集器不同。
CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。
吞吐量 = 运行用户代码时间/(运行用户代码时间 + 垃圾收集时间),例如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,则吞吐量就是99%
1.4 Serial Old收集器
Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。它的主要意义也是在于给Client模式下的虚拟机使用。
如果在Server模式下,那么它主要还有两大用途:
- 在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用。
- 作为CMS收集器的后备预案,在并发收集发生Concurrent Model Failure时使用。
1.5 Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源敏感的场合,都可以有限考虑Parallel Old加Parallel Scavenge收集器。
1.6 CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务上,尤其重视服务的响应速度,CMS收集器就非常符合这类应用的需求。也是基于“标记-清除”算法实现。优点是:并发收集、底停顿。
1.7 G1收集器
G1是一款面向服务端应用的垃圾收集器。它具备以下特点:
- 并行与并发
- 分代收集
- 空间整合
- 可预测的停顿