JVM常用垃圾回收器的特性与使用场景
jvm垃圾回收器是GC算法的具体实现。常用的垃圾回收器有以下几种,并且分别针对的是堆内存中的新生代、老年代。值得一提的是方法区(有的文章也将之称为永久代,主要存放类信息、常量池、静态类变量等)也会触发GC,主要是回收不可存活的常量对象以及无用类(当该类在程序中不再存在任何实例、对应的classloader被卸载、该类的类对象class不被任何地方引用,此时可以被回收)。
1.Serial垃圾回收器
简要概括下该回收器的特点:单线程,基于复制算法,JVM运行在Client时默认的新生代垃圾收集器。
可以说Serial是最基本的垃圾回收器,使用的是复制算法,回收效率高,不容易产生不连续的内存碎片。并且也是单线程的垃圾回收器,只使用一个线程完成垃圾回收工作,并且此时会暂停其他工作线程。
2.ParNew垃圾回收器(serical+多线程版本)
简要概括下该回收器的特点:Serial的多线程实现,基于复制算法,JVM运行在Server时默认 的新生代垃圾收集器。
该垃圾回收器是Serial的多线程版本,采用的也是复制算法(毕竟都是作用于新生代嘛),也是在执行垃圾回收收集时需要暂停其他工作线程。
默认开启与CPU相同数目的线程数,可以通过参数-XX:ParallerGCThreads来修改默认开启的线程数量。
3.Parallel Scavenge垃圾回收器(多线程复制算法)
简要概括下该回收器的特点:多线程,基于复制算法,以吞吐量最大化为目标,允许较长时间的STW换取吞吐量。
该回收器也是新生代的GC回收器,同样采用复制算法,多线程的策略。主要关注的吞吐量(即CPU运行用户代码的时间/CPU总消耗的时间,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))。
4.Serial Old 垃圾回收器(单线程标记整理算法)
简单概括下该回收器的特点:单线程,基于标记整理算法,是JVM运行在Client模式下默认的老年代垃圾回收器,可和Serial搭配使用。
Serial Old回收器时Serial回收器的老年代版本,也是单线程,但采用的标记整理的算法。
这里注意最重要的特点就是这两种回收器都会使得工作线程被停止,并且均是单线程模式。
与两个Serial不同的是,Scavenge/ParNew采用的是多线程版本,但是此时也会暂停其他工作线程。
5.Parallel Old垃圾回收器(多线程标记整理算法)
简单概括下该垃圾回收器的特点:多线程,基于标记整理算法,优先考虑系统的吞吐量。
该垃圾回收器是Paralle Scavenge的老年代版本,多线程、标记整理。
在JDK1.6 之前,新生代使用ParallelScavenge 收集器只能搭配年老代的Serial Old 收集器,只 能保证新生代的吞吐量优先,无法保证整体的吞吐量,Parallel Old 正是为了在年老代同样提供吞 吐量优先的垃圾收集器,如果系统对吞吐量要求比较高,可以优先考虑新生代Parallel Scavenge 和年老代Parallel Old 收集器的搭配策略。
6.CMS垃圾回收器(多线程标记清楚算法)
简单概括下该垃圾回收器的特点:多线程,基于标记清除算法,为老年代设计,追求最短停顿时间。主要有四个步骤:初始标记、并发标记、重新标记、并发清除。不会暂停用户工作线程。
全称为Concurrent mark sweep,该回收器是专门为老年代设计的,主要追求的是最短的停顿时间,采用的标记清楚算法。四个主要工作阶段的内容为:
初始标记
标记一下GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
(这里简要回顾下哪些对象可以作为GC Roots:
-
java虚拟机栈中的引用对象
-
方法区中的常量引用对象
-
方法区中的静态变量引用的对象
-
本地方法栈中一般Native方法引用的对象
)
并发标记
进行GC Roots 跟踪的过程,和用户线程一起工作,不需要暂停工作线程。
重新标记
为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。
并发清除
清除GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作,所以
总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行。
7.G1垃圾回收器
简要概括下该垃圾回收器的主要特点:将堆内存分为几个大小固定的独立区域,在后台维护了一个优先列表,根据允许的收集时间回收垃圾收集价值最大的区域。相比CMS不会产生内存碎片,并且可精确控制停顿时间。分为四个阶段:初始标记、并发标记、最终标记、筛选回收
该垃圾回收器看似和CMS工作流程差不多。采用的却是标记清楚算法,但是本质上还是存在差别,尤其是讲堆内存分为大小固定的几个区域,并且维持了一个优先列表,选取其中最有价值的回收垃圾。
Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与CMS 收集器,G1 收集器两个最突出的改进是:
-
基于标记-整理算法,不产生内存碎片。
-
可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。 G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域 的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾 最多的区域。区域划分和优先级区域回收机制,确保G1 收集器可以在有限时间获得最高的垃圾收 集效率。