JVM虚拟机学习--必会的GC垃圾收集器介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stalin_/article/details/82971278

GC垃圾收集器从JDK1.3至今,发展出一大批垃圾收集器。它们不断完善,回收机制越来越复杂。为消除或减少工作线程因内存回收而导致停顿而不断努力着,用户线程的停顿时间不断缩短,但仍没办法完全消除。更优秀的垃圾收集器仍然在不断的被研究出来。下面就来介绍一下这些发展过程中的GC垃圾收集器。

1.Serial 收集器:

是最古老,最基本的一款垃圾收集器,由于初代没有考虑到太多性能问题,它是唯一一个单线程的收集器。再进行垃圾回收的同时,必须将用户的其他工作线程统统停掉,直到它收集结束。这给用户造成了不便,因此很快就被替代了。

但是这款最古老的收集器也不是一无是处,它的优点在于简单高效。所以在Client模式下的虚拟机中仍然可以使用。

2.ParNew 收集器:

它是Serial的并行版本,原理代码有很大部分都是相同的。是一款新生代收集器。它受欢迎的主要原因是只有它可以与后来性能优良的CMS收集器一起使用。

另外值得注意的是,在单核情况下ParNew收集器的性能不如Serial收集器,不过现在CPU很少有单核的了。

3.Parallel Scavenge 收集器:

它也是一个新生代处理器,那它和ParNew有什么区别呢?原来它可以控制吞吐量。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾回收时间),控制吞吐量会有不同的效果,低吞吐量会使GC所拥有的新生代内存缩小,回收间隔变短。回收速度变快。高吞吐量可以最高效率的利用CPU运行时间,尽快完成计算任务。我们可以根据实际情况进行吞吐量的修改。

参数:-XX:MaxGCPauseMillis  最大垃圾收集停顿时间

          -XX:GCTimeRatio   吞吐量大小(1-99整数)

          -XX:UseAdaptiveSizePolicy   自适应调节开关(自动进行调节)

4.Serial Old 收集器:

它是一个单线程的Serial的老年代的收集器,使用的是标记-整理算法。它主要是也在client模式下的虚拟机使用。在JDK1.5版本之前与Parallel Scavenge一起搭配使用。还有就是作为CMS收集器的后备方案。在并发收集发生Concurrent Mode Failure的时候使用。

5.Parallel Old 收集器:

它是Parallel Scavenge的老年代版本,使用多线程+标记-整理算法。在它出现之前Parallel Scavenge一直没有一个合适的组合方案,体现不出吞吐量最大化的效果。(当时Parallel Scavenge只能与Serial Old组合,而单线程的Serial Old性能并不好)

直到Parallel Old的出现,在注重吞吐量及CPU资源敏感的场合,都可以使用Parallel Scavenge+Parallel Old收集器组合来对新生代,老年代进行收集。

6.CMS 收集器:

它是一种以获取最短回收停顿时间为目标的收集器。由于目前Java应用大部分都是注重响应服务速度的B/S应用,希望系统停顿的时间短,用户体验好,因此CMS收集器的出现大受欢迎。CMS是基于标记-清除算法的。

优点:CMS为什么停顿时间短,原因是它把收集步骤分成多步,将耗费时间多的部分(并发标记,并发清除)与用户线程并发进行,耗费时间短的部分(初始标记,重新标记)进行停顿,这样就使其拥有:并发收集,停顿时间短的优点。

缺点:

1)CMS收集器对CPU资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低。

2)CMS收集器无法处理浮动垃圾,可能会出现“Concurrent Mode Failure(并发模式故障)”失败而导致Full GC产生。

浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随着程序运行自然就会有新的垃圾不断产生,这部分垃圾出现的标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC中再清理。这些垃圾就是“浮动垃圾”。

3)CMS是一款“标记--清除”算法实现的收集器,容易出现大量空间碎片。当空间碎片过多,将会给大对象分配带来很大的麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。

7.G1收集器:

G1收集器是目前最先进的一款收集器。在JDK1.7版本正式发布。它解决了CMS的碎片问题,它是依据标记-整理算法开发的。同时它可以在基本不牺牲吞吐量的情况下完成低停顿的内存回收。原因在于它可以极力避免全区域的垃圾收集。G1将整个Java堆划分为多个大小固定的独立区域并跟踪这些区域各自的垃圾堆积程度,维护成一个列表,每次根据列表中垃圾最多的区域优先进行回收。确保在最短的时间内获得最大的收集效率。

 

以上摘自-《深入理解Java虚拟机》作为笔记留作复习之用。

 

喜欢的朋友点个赞哦~~

阅读更多

扫码向博主提问

stalin_

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页