JVM学习笔记(七)———经典垃圾收集器(1)

经典垃圾收集器

(本篇不包含CMS和G1收集器,第二篇链接
经典垃圾收集器指的是已经经历过大量实践,足够程数,目前可以在商用生产环境下放心使用的垃圾收集器,各垃圾收集器关系如下图
在这里插入图片描述

注:图中上半部分是针对新生代的垃圾收集器,下半部分是针对老年代的垃圾处理器,G1特殊不使用传统意义上的分代思想。连线表示线段两端的垃圾收集器可以搭配使用,其中星标连线代表只有JDK9及后续版本,现段两端的垃圾收集器才可以搭配使用。

垃圾收集器的分类

线程数

按垃圾收集使用线程数可以分为串行垃圾收集和并行垃圾收集

  • 串行垃圾收集指的是垃圾收集执行时,同时只允许一个线程进行垃圾收集,且在这个垃圾收集过程需要暂停所有用户线程,串行垃圾收集适用于处理器较少或内存等硬件条件较差的场景。
  • 并行垃圾收集指的是垃圾收集执行是,允许多个线程同时进行垃圾收集,但同样要暂停所有用户线程,并行垃圾收集在处理器较多且硬件较为优越的运行环境下的表现要优于串行垃圾收集。

工作模式

按照工作模式可分为独占式垃圾收集和并发式垃圾收集

  • 独占式垃圾收集指的是,在垃圾收集行为正在执行的过程中,必须暂停所有用户线程,垃圾收集完成后再恢复,上述的串行垃圾收集和并行垃圾收集都属于独立式垃圾收集
  • 并发式垃圾收集指的是,垃圾收集任务与用户线程交替工作,尽可能减少用户暂停时间

根据以上两个板块的说明,可将七款经典垃圾收集器进行工作模式上的分类,即

——独占式垃圾收集:
————串行垃圾收集:Serial,Serial Old
————并行垃圾收集: ParNew,Parallel Scavenge,Parallel Old
——并发式垃圾收集:CMS,G1

空间碎片化问题处理方式

处理方式可以分为压缩式和非压缩式垃圾回收,实质上就是取决于具体的垃圾收集器选用了哪种垃圾收集算法

  • 使用了标记-复制算法或标记-整理算法的垃圾收集器均为压缩式垃圾回收,为对象分配新的内存空间时使用的便是前文中提及的指针碰撞。
  • 使用了标记-清除算法的垃圾收集器均为非压缩式垃圾回收,为对象配文新的内存空间时使用的是前文中提及的空闲列表。

七款垃圾收集器再空间碎片化处理方式上分类如下

——压缩式垃圾回收:
————标记-复制算法:Serial,ParNew,Parallel Scavenge,G1
————标记-整理算法:Serial Old,Parallel Old,G1
——非压缩式垃圾回收(标记-清除算法):CMS

分代收集

垃圾收集器可分为,新生代垃圾收集、老年代垃圾收集、整堆收集和混合收集

——新生代垃圾收集:Serial,ParNew,Parallel Scavenge
——老年代垃圾收集:Serial Old,Parallel Old,CMS
——混合收集:G1
——整堆收集:Full GC(代码中System.gc()调用的就是Full GC)

各收集器介绍

接下来将逐一介绍这七款垃圾收集器的特点与思路,开始之前应先明确,当前条件下的垃圾收集器没有最好,也不存在万能一说,每个垃圾收集器都有其最适合的应用场景和用武之地。

Serial收集器

Serial收集器是最基础的垃圾收集器,它采用标记-复制算法进行垃圾回收。该收集器是一个单线程工作的收集器,即在进行垃圾收集时,必须要暂停其他所有工作的线程。暂停用户线程这项工作是虚拟机后台自动发起和自动完成的,用户不可知何时发起,也对该项工作不可控,这对很多场景的应用是不可接受的。

虽然Serial用户线程停顿的问题非常明显且较为严重,但他仍然是HosSpot虚拟机运行客户端模式下的默认新生代收集器,对比其他收集器,他简单高效(与其他收集器的单线程对比),对于内存资源受限的环境,它是所有收集器中额外内存消耗最小的。对于单核或处理器核心较少的环境来说,Serial处理器没有线程交互的开销,只专注于垃圾收集自然可以获得最高的单线程垃圾收集效率。

在新生代空间较小(数十到一两百兆)的情景下,Serial垃圾收集的停顿时间可以控制在数十毫秒,只要不是频繁的进行垃圾收集,这种级别的停顿时间是可以被大多数用户接受的,因此Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择。

Serial Old收集器

Serial Old是Serial收集器的老年代版本,同样也是单线程收集器,采用的垃圾收集算法是标记-整理算法。该收集器的主要意义和Serial相同,也是供客户端模式下的HotSpot虚拟机使用,他可以在JDK 5及以前版本中与Parallel Scavenge搭配使用(Parallel Scavenge收集器中本身自带了PS MarkSweep收集器来进行老年代收集,但该收集器用户Serial Old收集器的实现几乎相同);另一种就是作为CMS收集器发生失败时的后备预案,后文会进行说明。

Serial/Serial Old收集器运行示意图如下
在这里插入图片描述

ParNew收集器

ParNew收集器实质上是Serial收集器的多线程并行版本,除支持多线程进行垃圾收集外,包括收集器控制参数、收集算法(标记-复制算法)、用户线程暂停,对象分配策略和回收规则等都与Serial收集器完全一直,实现上二者也共用了许多代码。

ParNew收集器运行示意图如下:
在这里插入图片描述
实际应用场景中,虽然相比Serial收集器并无太大创新,但ParNew收集器是不少服务端模式下的HotSpot虚拟机(尤其是JDK 7之前的系统)首选的新生代收集器,其中一个重要原因是除了Serial收集器外,只有ParNew可以与CMS收集器配合工作。

Parallel Scavenge收集器

Parallel Scavenge是一款新生代收集器,它与Serial采用的算法相同,都是标记-复制算法,区别在于此收集器是能够并行收集的多线程收集器,Parallel Scavenge收集器在许多特征上与ParNew收集器相似,一个重大的区别是,Parallel Scavenge收集器的关注点与其他收集器不同,Parallel Scavenge收集器关注的核心目标是打到一个可控的吞吐量,吞吐量即处理器用于运行用户代码和处理器总耗时的比值,即

吞吐量 = 运行用户代码时间/运行用户代码时间+运行垃圾收集时间

假设总运行时长100分钟的任务,垃圾收集占了一分钟,那么吞吐量就是99%,停顿时间越短越适合需要与用户交互需要保证服务响应质量的程序,吞吐量相反,吞吐量越高越是和不需要过多用户交互,主要是后台运算的程序,高吞吐量意味着程序可以高效率的利用处理器资源,尽快完成运算任务。

Parallel Scavenge收集器提供了两个参数用于控制吞吐量,和一个参数用于虚拟机根据自动调节控制吞吐量的参数,他们分别为

  • -XX:MaxGCPauseMillis:此参数用于控制最大线程暂停时间,值应设为大于0ms的数值,降低垃圾停顿时间的同时也会降低吞吐量和新生代空间,设置时并非越小越好。
  • -XX:GCTimeRatio:此参数用于设置吞吐量,值为大于0小于100的整数,标识垃圾收集时候喝总时间的比率。
  • -XX:+UseAdaptiveSizePolicy:此参数为一个开关参数,当开启时,虚拟机会自动根据当前系统的运行情况收集性能检测信息,进而动态的调整上述参数以提供最合适的停顿时间与最大吞吐量。

-XX:+UseAdaptiveSizePolicy参数所实现的虚拟机自动调节方式被称为垃圾收集的自适应调节策略,用户只需要将基本的内存数据设置好,之后为虚拟机设定一个优化目标,虚拟机就会自动的完成调节工作。自适应调节策略也是Parallel Scavenge收集器区别于ParNew收集器的一个重要特征

Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,同样支持多线程并发垃圾收集,基于标记-整理算法实现。

Parallel Old收集器的出现解决了没有合适的老年代收集器与Parallel Scavenge收集器搭配使用的问题,Parallel Old收集器问世之前,Parallel Scavenge只能使用Serial Old作为老年代垃圾收集器,Serial Old的单线程工作模式无法充分的利用服务器多处理器的并行处理能力,在一些老年代空间较大切硬件配置较高的运行环境中,二者搭配使用不一定能在整体上获得吞吐量最大化的效果。

Parallel Old收集器出现后,在注重吞吐量或处理器资源稀缺的场景下,可以优先考虑Parallel Old与Parallel Scavenge组合使用,以追求吞吐量优先。

Parallel Scavenge/Parallel Old收集器运行示意图如下:
在这里插入图片描述


参考书籍 《深入理解Java虚拟机》第三版 ——周志明
本篇内容主要用于作者自身学习总结记录,才疏学浅,如文中出现纰漏,还望指正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7rulyL1ar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值