iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JVM常用垃圾收集器详细解说
  • 553
分享到

JVM常用垃圾收集器详细解说

2024-04-02 19:04:59 553人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言新生代垃圾收集器老年代垃圾收集器不分代垃圾收集器前言 在上一篇,我们谈到了JVM垃圾回收算法详细解析,并了解了JVM中针对堆区中不同的分代采用不同的垃圾回收算法 在了解了垃圾

前言

在上一篇,我们谈到了JVM垃圾回收算法详细解析,并了解了JVM中针对堆区中不同的分代采用不同的垃圾回收算法

在了解了垃圾回收算法之后,很多伙伴不禁在想,既然是分代垃圾回收,自然新生代和老年代的垃圾收集器也是不同的,事实上确实是这样,分代的回收算法也产生了不同的垃圾收集器

先来看一下下面这张简图:

左边表示年轻代中可选的垃圾收集器,右边表示老年代中可选的垃圾收集器,任何两个连线之间的两种垃圾收集器可以进行组合使用,在年轻代中,Parallel Scavenge 是默认的GC收集器,而在老年代中,SerialOld为默认的GC收集器

上面的看到的年轻代和老年代收集器属于分代收集器,在jdk1.8中,由于采用了分代垃圾回收,故使用分代垃圾收集器进行GC,各个垃圾收集器根据自身的特点都有着不同的使用场景,下面针对各个垃圾收集器进行简单的说明,以便深入理解各款垃圾收集器的使用原理

可以使用下面的命令查看本机或者虚拟机上的JVM的垃圾收集器(默认安装的JDK版本)

java -XX:+PrintCommandLineFlags -version

新生代垃圾收集器

Serial

Serial垃圾收集器也叫做串行收集器,串行垃圾收集器的特点:

  • 使用单线程对垃圾对象进行GC
  • 用于年轻代的垃圾收集器
  • 适合单核CPU
  • 执行效率较低,STW时间较长(其间将会产生较长的GC等待时间)
  • 适用于垃圾较小的内存场景(几十MB)
  • 主流虚拟机已淘汰

ParNew

这是对单线程的Serial的一种改进,ParNew收集器是并行的,在多CPU的场景下会有比串行收集器更好的性能,除此之外,实现算法跟Serial完全一样

ParNew垃圾收集器特点:

  • JDK8之后默认的年轻代垃圾收集器
  • STW短时优先,GC次数多(但是总体保证每次GC时间较短)
  • 使用多个线程(默认情况下与CPU核数一致)并行GC,效率提升
  • 适合多核CPU
  • 适用于较大的内存对象场景适合与用户交互的场景
  • 一般与CMS配合使用

Parallel Scavenge

也称作PS收集器,这也是一种新生代垃圾收集器,它采用的也是复制算法,与前两种收集器最大的区别是,它关注的是吞吐量而不是延迟,也被称为是吞吐量优先的收集器

其特点为:

以追求吞吐率最小(每一次GC消耗的时间 / 总时间)优先JDK1.8默认的垃圾收集器(年轻代)STW时间长,GC次数少(目前Java应用的部署的服务器更多的是进行后台任务的计算,直接与用户交互的过程较少,因此减少GC次数就很有必要)多线程GC,执行效率较高适合多核CPU适合后台计算任务

老年代垃圾收集器

SerialOld

这个是jdk1.2以前的默认收集器,适合单线程下作为CMS的备用收集器,由于运行效率较低,目前基本上很少使用,其运行原理和年轻代的Serial相似

Parallel Old

该收集器可以理解为PS收集器的老年代版本(对比理解PS收集器),其主要特点包括:

关注吞吐率STW时间较长,GC次数少多线程GC,执行效率较高适合多线程CPU适合后台计算任务

CM

CMS,Concurrent Mark Sweep,这是一款真正的并发收集器,属于老年代的垃圾收集器中最复杂的一款垃圾收集器,其主要特点为:

  • 用户线程与GC并行执行(前面的收集器是用户线程和垃圾回收线程是不同的线程,因此STW时间相对较长),用户的感知最小
  • 超短的STW,适合较大的内存环境(几十G)
  • 会产生浮动垃圾
  • 会产生标记失败
  • 会降低用户线程的CPU使用效率(CPU需要分出部分的线程同时处理垃圾回收,以至CPU不能全部用户用户线程的任务处理)
  • 标记清除时产生大量内存碎片(CMS采用标记清除算法)
  • JDK14被废弃

从上图中我们发现,CMS垃圾回收器在执行一次完整的垃圾回收时要经历几个阶段:初始标记(会产生一个很短的STW) ,并发标记,重新标记,并发清理,

对其中的几个关键点做简单的说明:

  • 初始标记:只标记GCRoot第一层关联
  • 浮动垃圾:运行中未及时发现的垃圾对象,会在重新标记阶段进行标记(由于用户线程和GC线程是并发执行的)
  • 标记失败:被认定的垃圾对象在后面的阶段中再次被引用,在重新标记阶段修正
  • 并发清理:会针对前面产生的各种垃圾对象,并发标记和重新标记阶段中的那些垃圾对象在并发清理阶段完成一次真正意义上的回收,此时用户线程将会处于暂停的状态(实际产生的情况很少)

在实际工作中如何通过参数设置进行搭配使用呢?可以参考下面的表格:

如果想要自定义自己的应用使用某种收集器,以springboot的jar包为例,可以使用下面的命令:

java -jar -XX:+UseParallelGC XXX.jar

以上是关于分代垃圾收集器中,新生代和老年代各款收集器的说明,但是随着JVM的持续迭代与优化,垃圾收集器也在持续完善,比如JDK9开始就出现了不分代垃圾收集器,像CMS收集器,在JDK14中被废弃,说明了在迭代中,有更好的收集器取代它,下面再介绍几种常用的不分代垃圾收集器

不分代垃圾收集器

常用的不分代垃圾收集器包括下面几种:

  • G1收集器
  • ZGC收集器
  • Shenandoah收集器

G1收集器

G1收集器,是比前面的更优秀,真正有突破的一款垃圾收集器,在G1中还是保留了分代的概念,是实际上已经在新生代和老年代中没有物理隔离了,在G1中,内存空间被分割成一个个的Region区,所谓新生代和老年代,都是由一个个region组成的,同时G1也不需要跟别的收集器一起配合使用,自己就可以搞定所有内存区域。整体上来讲不是一个分代收集器,是一个通吃收集器。这也是JVM内存管理和垃圾收集的一个发展趋势。从后面zgc中我们可以更清晰的看到这个变化

G1采用了标记-整理算法,避免了CMS中的内存碎片问题,另外它能达到可控的垃圾时间

整体来说,G1收集器的特点:

  • JDK1.9默认的垃圾收集器
  • 多线程并发标记,并发回收
  • 物理分区(Region),1/2/4/8/32mb(即在物理存储上,不再像分代那样有明确的分代概念,提供了这几种大小规格进行选择)
  • 逻辑分代,物理分区
  • GC时间极短,单次STW的时间默认最多200MS
  • 支持上百G的内存GC

G1垃圾回收过程可以和CMS垃圾回收过程进行类比,可以认为是G1收集器吸收了CMS的某些优秀的特点并进行了改良,但在其内部,仍然是以分代的思想进行垃圾回收,即采用了: 新生代 + 老年代 的混合回收算法(Mixed GC),触发条件为:老年代超过了堆内存的45%

ZGC

zgc是jdk11中要发布的最新垃圾收集器,不管是CMS收集器,还是G1收集器(尽管物理上没有分代的概念,但是逻辑上仍然采用了分代的思想进行垃圾回收),都有一个特点,就是在整个垃圾收集过程中的初始标记最终标记阶段,会有一个STW的产生,尽管G1相比CMS有了更大的提升,但是由于分代的概念存在,始终无法绕过这个问题

ZGC特点:

  • JDK11出现的实验性的GC,oracleJDK中使用
  • <10ms的STW时间
  • 分区容量可动态规划,小的region - 2MB,中 - 32MB(根据对象大小的不同开辟不同Region大小的内存块)
  • 支持T级别的内存GC
  • 彻底不分代,利用染色指针实现对象引用
  • 在GC的标记压缩回收对象过程中与用户线程并发执行,但是过程中并不产生STW

Shenandoah收集器

Shenandoah收集器目前在JDK12中也处于实验性阶段,其主要特点包括:

  • 一款实验性的GC,OpenJDK中使用
  • <10ms的STW时间
  • 固定大小内存块,彻底不分代
  • 支持T级别的内存GC
  • 利用读屏障与转发指针实现对象的动态引用
  • 在GC的标记压缩与回收对象过程中与用户线程并发执行,过程中不再产生STW

后面两种收集器可以作为学习进行了解,尽管目前还没有大规模的投入商用,但是其设计理念却为未来的垃圾收集器的持续优化和改进提供了很好的思路和方向,尤其是ZGC 和Shenandoah的超低延迟STW,可以说在分代收集器的基础上进行了相当大的提升,让我们拭目以待吧

到此这篇关于JVM常用垃圾收集器详细解说的文章就介绍到这了,更多相关JVM垃圾收集器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JVM常用垃圾收集器详细解说

本文链接: https://www.lsjlt.com/news/164541.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM常用垃圾收集器详细解说
    目录前言新生代垃圾收集器老年代垃圾收集器不分代垃圾收集器前言 在上一篇,我们谈到了jvm垃圾回收算法详细解析,并了解了JVM中针对堆区中不同的分代采用不同的垃圾回收算法 在了解了垃圾...
    99+
    2024-04-02
  • JVM垃圾回收——G1垃圾收集器
    目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程  四、G1收集器的优缺点 五、G1收集器的JVM参数配置 一、什么是G1垃圾收集器         Garbage First(简称G1)收集...
    99+
    2023-10-25
    jvm java G1
  • JVM垃圾回收器详解
    这篇文章主要介绍“JVM垃圾回收器详解”,在日常操作中,相信很多人在JVM垃圾回收器详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM垃圾回收器详解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1 ...
    99+
    2023-06-02
  • JVM常见垃圾收集器有哪些
    这篇文章主要介绍了JVM常见垃圾收集器有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JVM常见垃圾收集器有哪些文章都会有所收获,下面我们一起来看看吧。垃圾收集器类型垃圾收集器 是 垃圾收集算法 的具体实现...
    99+
    2023-07-02
  • jvm垃圾回收算法详细解析
    目录前言几种常用的垃圾回收算法1、引用计数法2、根搜索算法3、标记清除法(Mark-Sweep)4、复制交换算法(Mark-Sweep)5、标记压缩算法(Mark-Compact)J...
    99+
    2024-04-02
  • Java jvm垃圾回收详解
    目录常见面试题1.JVM内存回收和分配1.1主要的区域?gc测试1.2大对象进入老年代1.3长期存活的对象进入老年代1.4主要进行gc的区域gc的类型Young GcFull Gc1...
    99+
    2024-04-02
  • JVM常见垃圾收集器学习指南
    目录前言垃圾收集器类型1. Serial收集器1.1 定义1.2 优点1.3 使用的垃圾收集算法1.4 应用场景1.5 工作流程2. Serial Old收集器2.1 定义2.2 优...
    99+
    2024-04-02
  • JVM中常见的垃圾收集器有哪些
    这篇文章主要介绍了JVM中常见的垃圾收集器有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java...
    99+
    2023-06-02
  • jvm默认垃圾收集器是什么
    JVM(Java虚拟机)的默认垃圾收集器取决于所使用的Java版本和操作系统。在JDK 8及之前的版本中,默认的垃圾收集器是Para...
    99+
    2023-09-26
    jvm
  • 最新JVM垃圾回收算法详解
    目录1.垃圾回收需要做什么2.如何判断对象可被回收2.1 引用计数算法2.1.2 优点2.1.2 缺点2.2 可达性分析算法2.2.1 算法思路2.2.2 GC Roots对象(两栈...
    99+
    2024-04-02
  • GC参考手册jvm垃圾回收详解
    1,什么是垃圾回收? 顾名思义,垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并进行清理。但现有的垃圾收集实现却恰恰相反: 垃圾收...
    99+
    2024-04-02
  • JVM的垃圾回收机制详解与调优
    这篇文章主要讲解了“JVM的垃圾回收机制详解与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM的垃圾回收机制详解与调优”吧!JVM的gc概述gc即垃圾收集机制是指jvm用于释放那些不...
    99+
    2023-06-03
  • CPython垃圾收集器检测循环引用详解
    目录CPython 中的垃圾收集器检测循环引用CPython 中的垃圾收集器 CPython 的垃圾收集器(简称GC)是 Python 内置的为了解决循环引用问题的方法。默认情况下,...
    99+
    2024-04-02
  • 怎么查看JVM使用的默认的垃圾收集器
    本篇内容介绍了“怎么查看JVM使用的默认的垃圾收集器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查看JVM使用的默认的垃圾收集器查看步骤c...
    99+
    2023-06-25
  • 如何理解JVM全部垃圾回收器
    如何理解JVM全部垃圾回收器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的7种收集器,其适用的范围如图所示Serial、ParNew、Parallel Scaveng...
    99+
    2023-06-19
  • 如何查看JVM使用的默认的垃圾收集器
    查看JVM使用的默认的垃圾收集器查看步骤cmd执行命令:java -XX:+PrintCommandLineFlags -version输出如下(举例):针对上述的-XX:UsePa...
    99+
    2024-04-02
  • 浅谈JVM垃圾回收有哪些常用算法
    一、前言: 垃圾回收: 在未来的JDK中可能G1会为ZGC所取代 先问自己几个问题: 什么是垃圾? 垃圾就是堆内存中(范指)没有任何指针指向的对象实体。不具有可达性。 为...
    99+
    2024-04-02
  • Java 垃圾回收超详细讲解记忆集和卡表
    目录跨代引用解决跨代引用记忆集卡表跨代引用 在说记忆集和卡表之前,先给大家介绍一下跨代引用的问题。 假如要现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代的实例...
    99+
    2024-04-02
  • 详解Java 虚拟机(第⑤篇)——垃圾收集
    垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。一、判断一个对象是否可被回收1. 引用计数算法为对象添加一个引用...
    99+
    2023-06-05
  • 怎么理解JVM1.4.1版本中的JVM垃圾收集策略
    本篇文章给大家分享的是有关怎么理解JVM1.4.1版本中的JVM垃圾收集策略,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们分析了引用计数、复制、标记-清除和标记-整理这些经...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作