如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。HotSpot虚拟机中的7个垃圾收集器如下所示:
如果两个收集器存在连线,说明可以搭配使用。所处的区域表示属于新生代还是老年代收集器。
以串行的方式执行,是单线程的收集器,只会使用一个线程来进行垃圾收集工作。
新生代采用复制算法,老年代采用标记-整理算法。
它的优点是简单高效,对于单个 CPU 环境来说,由于没有线程交互的开销,因此拥有最高的单线程收集效率。
它是 Client模式下的默认新生代收集器 ,因为在该应用场景下,分配给虚拟机管理的内存一般来说不会很大。Serial 收集器收集几十兆甚至一两百兆的新生代停顿时间可以控制在一百多毫秒以内,只要不是太频繁,这点停顿是可以接受的。
是Serial收集器的多线程版本。除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器完全一样。
新生代采用复制算法,老年代采用标记-整理算法。
是 Server模式下的虚拟机首选新生代 收集器,除了性能原因外,主要是因为除了 Serial 收集器,只有它能与 CMS 收集器配合工作。
在单CPU的环境中不会有比Serial收集器更好的效果。但是随着使用的CPU的数量的增加,对于GC时系统资源的有效利用是有好处的。默认开启的线程数量与 CPU 数量相同,可以使用 -XX:ParallelGCThreads 参数来设置线程数。
并行:多条垃圾收集线程并行工作,单此时用户线程仍然处于等待状态。
并发:用户线程与垃圾收集线程同时执行,不一定是并行的。用户程序在继续运行,GC程序运行在另外一个CPU上。
类似于ParNew收集器,是一个并行的多线程收集器、新生代收集器,使用复制算法。
其它收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户代码的时间占总时间的比值。
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。
Serial收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用途:一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案,在并发收集发生 Concurrent Mode Failure 时使用。
是 Parallel Scavenge 收集器的 老年代 版本,使用多线程和“标记-整理”算法。
在注重吞吐量以及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器。
CMS(Concurrent Mark Sweep),Mark Sweep指的是标记-清除算法。
是一种以获取最短回收停顿时间为目标的收集器。因而非常符合在注重用户体验的应用上使用。
是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
分为以下四个流程:
主要优点: 并发收集、低停顿
具有以下三个缺点:
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,在多 CPU 和大内存的场景下有很好的性能,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征,被视为JDK1.7中HotSpot虚拟机的一个重要进化特征。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。
具有以下特点:
其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。
G1 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。通过记录每个Region垃圾回收时间以及回收所获得的空间(这两个值是通过过去回收的经验获得),并维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。
每个 Region 都有一个 Remembered Set,用来记录该 Region 对象的引用对象所在的 Region。通过使用 Remembered Set,在做可达性分析的时候就可以避免全堆扫描。
如果不计算维护 Remembered Set 的操作,G1 收集器的运作大致可划分为以下几个步骤:
参考: my.oschina.net/hosee/blog/…