引言
上一章我们已经探讨过GC的各个算法,那么垃圾汇集器是什么呢?
通俗的讲,利用编程语言将算法实现出来,发生的措施就是垃圾汇集器了。既然谈到了编程语言的实现,那么在接头垃圾汇集器的时候,就已经涉及到详细的虚拟机实现了。
或者有不少做JAVA开拓的猿友还不知道,我们平时利用的JDK中,默认的JVM是hotspot,换句话说,我们大部门时候利用的JVM都是hotspot的实现版本,因此,本次LZ接头垃圾汇集器都是基于hotspot版JVM来举办的,请列位猿友要知晓这一点。
更直观的,我们可以在我们平时开拓的机子上,输入java -version来查察JVM的版本,相信大部门猿友对这个呼吁都不生疏吧,LZ的机子截图如下。
垃圾汇集器的分类
上面我们已经提到,垃圾汇集器实际就是算法的编程语言实现。既然牵扯到编程语言,那么一定离不开线程,并且我们在前面讲授算法的时候也一直假设是一条GC线程在做着GC的工作。
因此,垃圾汇集器大抵分为以下三类。
串行汇集器(serial collector):它只有一条GC线程,且就像前面说的,它在运行的时候需要暂停用户措施(stop the world)。
并行汇集器(parallel collector):它有多条GC线程,且它也需要暂停用户措施(stop the world)。
并发汇集器(concurrent collector):它有一条或多条GC线程,且它需要在部门阶段暂停用户措施(stop the world),部门阶段与用户措施并发执行。
并发(concurrent)与并行(parallel)
看完上面的界说,相信有一部门猿友已经蒙了,一会单线程,一会多线程,一会串行,一会并行,一会并发,这都神马玩意?
URL:http://www.bianceng.cn/Programming/Java/201410/45824.htm
单线程和多线程就不必多说了,这个很好领略,串行与并行也较量好领略,难于鉴另外就是并行(parallel)与并发(concurrent)。
对付许多有关并发的表明,LZ以为有一个最贴切。它是这么表明的,并发就是两个任务A和B需要彼此独立的运行,而且A任务先开始后,B任务在A任务竣事之前开始了。
并发自己是较量好领略的,那么它与并行的干系与区别是什么呢?
事实上,并行是并发的一种实现方法。LZ以为这么说列位大概会更好领略,虽然,并行并不是并发的独一实现方法,尚有一种就是我们所熟悉的时间片切换。也就是A任务执行一会,B任务执行一会,瓜代执行。
并行必需在多核多处理惩罚器可能漫衍式系统(本质照旧多核多处理惩罚器)的前提下才气产生,而瓜代执行可能说时间片切换是在单核的处理惩罚器上产生的。
hotspot中的垃圾汇集器
我们上面已经简朴探讨了垃圾汇集器的分类,在hotspotJVM中,每一个种类的垃圾汇集器都有对应的实现,如下。
串行汇集器的实现:serial(用于新生代,回收复制算法)、serial old(用于大哥代,回收标志/整理算法)
并行汇集器的实现:ParNew(用于新生代,回收复制算法)、Parallel Scavenge(用于新生代,回收复制算法)、Parallel old(用于大哥代,回收标志/整理算法)
并发汇集器的实现:concurrent mark sweep[CMS](用于大哥代,回收标志/排除算法)
可以看到,上面每一种垃圾汇集器都是针对差异内存区域所设计的,因为它们回收的算法差异,每每用于新生代的都是利用的复制算法,而用于大哥代的都是利用的标志/排除可能标志/整理算法。
在实际应用中,我们需要给JVM的新生代和大哥代别离选择垃圾汇集器,可以看到无论是新生代照旧大哥代都别离有三种实现,换句话说,我们应该有3*3=9种选择。可是,事实并非如此。
事实上,这六种垃圾汇集器只有六种选择,因为有的垃圾汇集器由于详细实现的方法等一系列原因无法在一起事情,如下图。
针对上图,红的就是串行汇集器,绿的是并行汇集器,独一一个黄的是并发汇集器。上面三个是新生代的汇集器,下面三个是大哥代的汇集器。两者之间有连线,则暗示两者可以共同事情。
这六种组归并没有说哪个组合最强,哪个组合最弱,照旧那句话,只有最符合的,没有最好的。因此这就需要我们对每一种组合有必然的认识,才气在利用的时候选择更适合的垃圾汇集器。
竣事语
本次大抵先容了一下六种垃圾汇集器,以及它们的干系。每一种垃圾汇集器的特点与执行方法,我们在下一章再一起探讨。
作者:zuoxiaolong(左潇龙)
出处:博客园左潇龙的技能博客–http://www.cnblogs.com/zuoxiaolong