【JVM】程序员进阶JVM(三)——7大 垃圾回收算器

左手的ㄟ右手 2022-05-22 06:36 169阅读 0赞

一、前言

  1. 前几篇博客,小编向大家介绍了JVM的一些基本知识,包括JVM的运行时的内存结构,以及JVM是通过哪些算法回收对象,Jvm是通过哪些算法回收来判断出某些对象是可以回收的。而这些回收的工作都是垃圾回收器来完成的。
  2. 在这篇博客中,小编就从虚拟到现实,向大家介绍几款垃圾回收器。

二、垃圾回收器宏观介绍

  1. 学习回收器,思维导图先行:
  2. 这里呢,我们讨论的是JDK1.7 以后的HotSpot虚拟机中的垃圾收集器,主要是因为在JDK1.7 以后添加了G1回收器。

这里写图片描述

  1. HotSpotJVM虚拟机中,有7种垃圾回收器。这其中垃圾回收器也是从一代一代改进来的。当然垃圾回收处理的STW的停顿时间也越来越短。效率越来越高。因为我们的堆中,分了年轻代和老年代。每一个部分中用的内存收集算法是不一样的。针对不同的回收算法就设置了不同的垃圾收集器。

这里写图片描述

三、各种垃圾收集器


3.1 Serial

  1. 新生代收集器,可以说Serial是最基础的收集器。
  2. 看到Serial就经常相当序列化接口Serializable。虽然这两个之间没有任何关系,就是名字相似罢了。
  3. 再说Serial收集器,有下面的特点:
  • 单线程,当他收集内存的时候,所有其他的线程都要等待,直到他完成。
  • 复制算法

ParNew

  1. 新生代收集器,可以说ParNewSerial的一个多线程版本。
  2. 特点:
  • 多线程
  • 复制算法
  • 回收的时候暂停所有用户的线程
  • 只能配合CMS工作

Parallel Seaverage

  1. 新生代收集器,多线程,复制算法,更加关注吞吐量。
  2. 特点:
  • 多线程
  • 复制算法
  • 可控制的吞吐量
  • 自适应调节策略

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

  1. eg 虚拟机运行用户代码时间为99 ,垃圾回收为1 ,则吞吐量为99/(99+1)=99%
  2. 自适应调节策略:UseAdaptiveSizePolicy参数,这个参数打开后,不用手动设置Edens1s2的大小比例,收集器会根据当前虚拟机运行情况收集性能监控信息,动态的调整这些参数以供最合适的停顿时间和最大的吞吐量。
  3. 可以说,自适应调节策略是Parallel ScaverageParNew的主要区别。

Serial Old

  1. 老年代回收器。是一个单线程,使用标记-整理算法的垃圾收集器。
  2. 特点:
  • 单线程
  • 标记-整理算法
  • 暂停所有用户线程

Parallel Old

  1. 老年代收集器。是Parallel Scaverage的老年代版本。使用多线程和标记-整理算法。
  2. 特点:
  • 多线程
  • 标记-整理算法

CMS

  1. 老年代收集器。
  2. Concurrent Mark Sweep,是一种获取最短停顿时间为目标的回收器。现在很多业务场合都要求挺短时间短,CMS非常适合这种业务场景。
  3. Mark Sweep可以看出,这是一种标记清除算法,步骤:
  4. 1.初始标记
  5. 2.并发标记
  6. 3.重新标记
  7. 4.并发清除

这里写图片描述

  1. 特点:
  • 多线程
  • 标记清除算法
  • 对CPU资源敏感
  • 尽可能小的缩短停顿时间
  • 无法处理浮动垃圾
  • 产生内存碎片

G1

  1. G1垃圾收集器是面向服务端应用的垃圾收集器。在垃圾收集过程中,是可以替换掉CMS
  2. 特点:
  • 并行与并发:充分利用cpu,缩短STW停顿时间,不用停顿GC操作,并发执行。
  • 分代收集
  • 空间整合:整体上基于标记-整理算法,局部上是基于复制算法实现,不会产生内存碎片。
  • 可预测的停顿

四、小结

  1. 通过对这些垃圾收集器的理解,对比。相信可以更好的处理这些问题。也希望可以给您带来帮助。打开语音,多多交流。

发表评论

表情:
评论列表 (有 0 条评论,169人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM 垃圾回收

    GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了

    相关 JVM 垃圾回收

    分代收集: 根据各个年代的特点选取不同的垃圾回收算法 新生代使用复制算法 老年代使用标记-整理或者标记-清除算法 jps -v 显示当前使用的垃圾回收