深入理解JVM------垃圾收集器

引言

如果说收集算法是垃圾回收的方法论,那么垃圾收集器就是内存回收的具体实现。基于我们平时使用的jvm都是HotSpot的实现,因此,本篇讨论的垃圾收集器也是基于HotSpot的jvm。

垃圾收集器分类

 **串行收集器**:只有一条GC线程,运行时需要停止用户程序。


![](https://gitee.com/songjianzaina/juejin_p18/raw/master/img/d889d6c64799a565a84e36277ca013cd8237f25b54fedae642b8da5a3b02460c)![]( "点击并拖拽以移动")​

并行收集器:有多条GC线程,运行时也需要停止用户程序。

![](https://gitee.com/songjianzaina/juejin_p18/raw/master/img/a42ba18baf41d28690d02a29870b1102e38e1cbfdab215139a57c41ebb15ba12)![]( "点击并拖拽以移动")​


    **并发收集器**:有一条或多条GC线程,每个收集周期都要经历:**初始标记、并发标记、重新标记、并发清除**。


![](https://gitee.com/songjianzaina/juejin_p18/raw/master/img/edf9e8894f7d7fa044bbd1862190a742147fb030713a5d4fb38faff57b05a714)![]( "点击并拖拽以移动")​           

Garbage First(G1):有一条或多条GC线程,收集动作类似并发:初始标记、并发标记、重新标记、清除、转移回收。

![](https://gitee.com/songjianzaina/juejin_p18/raw/master/img/9c9938e2fc0985ee36639c74ccd86fac63d5878f54525004bc5862b3419392ef)![]( "点击并拖拽以移动")​

HotSpot中的垃圾收集器

上面我们已经知道了垃圾收集器的分类,下面我们看下每种类型下对应的垃圾收集器:   

串行收集器的实现: serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)。

并行收集器的实现: ParNew(用于新生代,采用复制算法)、Parallel Scavenge(用于新生代,采用复制算法)、Parallel old(用于年老代,采用标记/整理算法)。

并发收集器的实现: concurrent mark sweep[CMS](用于年老代,采用标记/清除算法)。

**Garbage First(G1):** 用于新生代和老年代,新生代采用复制算法、老年代采用标记-整理 **。**


 可以看到,上面每一种垃圾搜集器都是针对不同内存区域所设计的,因为它们采用的算法不同,凡是用于新生代的都是使用的复制算法,而用于年老代的都是使用的标记/清除或者标记/整理算法。


 下面我们来一起看下jdk垃圾回收的大家庭以及它们之间的相互组合关系:


 ![](https://gitee.com/songjianzaina/juejin_p18/raw/master/img/c1ffb9bda0edf82406765f8991406152c0d70655076c01495c5acd1ed4ec17f6)![]( "点击并拖拽以移动")​


 针对上面简单说明下,上面三个是新生代收集器,下面三个是老年代收集器,两者之间的连线表示两者可以配合使用,中间的G1收集器。

结束语

本章大致介绍了7种垃圾收集器,关于它们的运行方式和特点我们下一章再一起讨论。  

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%