深入理解JVM:常见的垃圾收集器

如果垃圾收集算法是垃圾回收的方法论,那么垃圾收集器就是垃圾回收的具体实现。

1.垃圾收集器简介

Java虚拟机规范对于垃圾收集器没有硬性规定,所以不同的厂商可以有自己不同的实现,而且可以根据版本以及分代的不同,有不同的垃圾收集组合,但是目的呢,就是为了能够高效的回收内存垃圾。我们常见的垃圾收集器,主要有以下这几种。
常见垃圾收集器

2.垃圾收集器组合

在这些垃圾收集器中,不同的垃圾收集器有自己的特性,所以收集垃圾的区域也是不一样的,根据这些垃圾收集器中的特点,在HotSpot虚拟机中,垃圾收集器主要的组合方式以及回收区域如下所示:
垃圾回收组合与区域

3.几种垃圾收集器

其实垃圾收集器,我们主要掌握这几种垃圾收集器的主要特点,以及他们所进行垃圾回收的区域,并且在进行垃圾回收的时候,对于用户线程有什么样的影响,如何改进它们等知识,如果需要深入的研究的话,感觉就需要深入垃圾收集器的源码进行学习了。

3.1Serial收集器

这是一块非常老牌的垃圾收集器,曾几何时,是JDK1.3之前虚拟机新生代垃圾收集的唯一选择。看名字就知道是单线程工作,而且在进行垃圾收集的时候,用户的其他线程都必须暂定,等人家垃圾收集完成之后,其他用户线程才能正常运行。
Serial垃圾收集器

就像早上开车出门上班,因为从车库到大门口只有一条道,如果不巧正好碰见一辆垃圾收集车在收集垃圾,那么你就要等一等,等人家收集完成之后你才能过去,这个过程中还一直叫喊着:“垃圾分类,全民参与,垃圾收集车已到,请提前做好垃圾收集准备r”。虽然给你带来了不良的体验,但是呢,就只有这么一个选择,只能认了。
那么看看这个垃圾收集器的运行示意图:
serial垃圾收集示意图

不过也不能说是这个垃圾收集器就没有用武之地,毕竟存在即合理。老而无用只是没有用对地方而已。对于运行在Client模式下的虚拟机来说,Serial垃圾收集器就是很不错的选择。

3.2ParNew收集器

这个ParNew收集器呢,其实就是Serial收集器的多线程版本,除了使用多个线程进行回收,其余的特性和Serial收集器基本完全一样。也就是说你早上出门,前面多了几辆垃圾收集器在收集垃圾,可能对你来说前面处理更快了,不用等太长时间。
ParNew收集器
ParNew收集器是许多运行在Server模式下的虚拟机的首选新生代垃圾收集器,并且除了serial之外,只有这个它能与CMS配合使用。看看ParNew垃圾收集的过程。
ParNew垃圾收集过程
这里要强调的是,单CPU的情况下,ParNew收集器的运行效率并不比Serial要好,甚至可能因为线程交互开销要差很多,但是随着CPU数量的增加,ParNew的优势越发显著,而且100%超过Serial。

3.3Parallel Scavenge收集器

这款垃圾收集器呢,是一款使用复制算法的新生代收集器,也是并行多线程的收集器,那么和ParNew的区别是哪里呢?回收的吞吐量限制。
PS收集器
PS收集器主要的目的是达到一个可控的吞吐量,也被称作“吞吐量优先”收集器。而且可以通过GC自适应调节,动态的调整停顿时间和最大吞吐量。
其垃圾收集过程如下:
PS垃圾回收过程

3.4Serial Old收集器

SO收集器

这个收集器呢,一看就知道是Serial收集器的老年代版本。在Client模式下的虚拟机中使用。其垃圾收集过程和Serial一样。
SO垃圾收集器
关于这个垃圾收集器也没有什么可介绍的,收集过程和特性也可以参考Serial。

3.5CMS收集器

CMS收集器
CMS收集器是以获取最短回收停顿时间为目标的收集器。从名字想必也可以看的出,这个收集器的实现采用的是“标记-清除”算法。相对于前面的收集器更为复杂一些,整个收集过程分为4个步骤,包括:

  • 初始标记(CMS initial mark)
    这个标记过程仅仅标记一下GC Roots能直接关联到的对象,需要STW,但速度很快。
  • 并发标记(CMS concurrent mark)
    进行GC Roots Tracing的过程。
  • 重新标记(CMS remark)
    为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般比较初始标记稍微长,但是远比并发标记时间短。
  • 并发清除(CMS concurrent sweep)
    可以和用户线程一起工作,和并发标记一样,而且这这是耗时最长的两个过程。
    具体垃圾收集过程如下:
    CMS垃圾收集过程
    不过CMS有3个明显的缺点:
  1. CMS收集器对CPU资源非常敏感。
  2. CMS收集器无法处理浮动垃圾。
  3. 基于标记清除算法,收集会产生内存碎片。

3.6G1收集器

G1收集器
G1收集器是当今收集器技术中最前沿的成果之一。G1是一款面向服务端的垃圾收集器。与其他GC收集器相比,G1具备以下特点:

  • 并行与并发
    G1能充分利用多CPU,多核环境下的硬件优势,使用多个CPU来缩短STW时间。
  • 分代收集
    分代收集依然还在G1中存留,而且G1是可以不需要任何收集器的配合而管理整个GC堆。
  • 空间整合
    从整体来看是基于“标记-整理”算法来实现的收集器,从局部(两个Region之间)来看是基于复制算法实现的收集器。
  • 可预测的停顿
    除了降低停顿时间外,还能建立可预测的停顿时间模型,这已经是实时Java垃圾收集器的特征。

整个垃圾收集过程如下:
G1垃圾收集过程

关于以上垃圾收集器的基本介绍就这么多,具体的实现细节可以参考网上其他资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值