【JVM】7种经典的垃圾收集器

news2024/12/23 23:30:06

文章目录

  • 1. 垃圾收集器概述
  • 2. Serial 收集器
  • 3. ParNew 收集器
  • 4. Paraller Scavenge 收集器
  • 5. Serial Old收集器
  • 6. Parller Old收集器
  • 7. CMS 收集器
  • 8. Garbage First 收集器

本文参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)

1. 垃圾收集器概述

image-20230212113322170

图中所示七种垃圾收集器虽然算不上先进技术,但是它们在实践中足够成熟,基本上可以认为是现在未来两、三年内,能够在生产环境上放心使用的所有垃圾收集器了。

这七种垃圾收集器是作用于不同分代的,两个收集器之间若有连线,则说明它们可以搭配使用。垃圾收集器的位置则表示了属于新生代还是老年代收集器。

垃圾收集器根据发展实践可以分为:

  1. 串行
  2. 吞吐量优先
  3. 响应时间优先

2. Serial 收集器

Serial收集器是最基础、历史最悠久的收集器。它是用于新生代的垃圾收集器。

这个收集器是一个单线程工作的收集器,“单线程”不仅仅代表了这个收集器只会使用一个处理器或一个收集线程去进行垃圾收集工作,更重要的是,Serial 收集器在进行垃圾收集的时候必须暂停其他所有工作,直到收集工作完成。

也就是说在用户不可知、不可控的情况下,把用户的正常工作的线程全部停掉,这是一个不能接受的事情。

image-20230212114757514

即使 Serial 收集器是最早出现的垃圾收集器,但是如今HotSpot虚拟机运行在客户端模式下的默认新生代收集器依然是 Serial 收集器。

Serial 收集器的优点很简单,那就是简单高效,在内存资源受限的环境中,它是所有收集器里额外内存消耗最小的,对于单核处理器或核心数较小的处理器来说,Serial 收集器没有线程交互的开销,专心做垃圾收集因此保证了收集效率。


3. ParNew 收集器

ParNew 收集器实际上就是 Serail 收集器的多线程版本,除了同时使用多线程进行垃圾回收之外,其他的任何行为包括所有控制参数、收集算法等都与 Serail 收集器一样,并无太多创新之处

image-20230212115554893

并且除了Serial收集器外,目前只有ParNew收集器可以与CMS收集器配合工作。

CMS是一款在强交互应用中几乎可称为具有时代意义的垃圾收集器,它是真正意义上支持并发的垃圾收集器,首次实现了让垃圾收集器线程在用户线程同时工作,所以,CMS的出现巩固了ParNew的地位

ParNew 收集器在单核心处理器的环境绝对不必Serial收集器更好的效果,甚至存在线程交互的开销。
ParNew收集器通过超线程技术实现的伪双核处理器环境中都不能百分之百超越Serial。

不过随着处理器核心数量的增加,ParNew对于垃圾收集时的系统资源高效利用还是很有好处的,它默认开启的收集线程数和处理器核心线程数相同。


4. Paraller Scavenge 收集器

Paraller Scavenge 收集器是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器。

该垃圾收集器常被称为“吞吐量优先收集器”

并行:并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态

并发:并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。

Paraller Scavenge 收集器的特点是达到一个可控的吞吐量。

image-20230212133427488

Parallel Scavenge 收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis 参数以及直接设置吞吐量大小的-XX:GCTimeRatio 参数

  1. -XX:MaxGCPauseMillis:参数允许值是一个大于0的毫秒数,收集器会尽力保证内存回收花费时间不超过用户的设定值,**但是这个参数值不建议设置得更小一点,因为垃圾收集停顿时间是牺牲吞吐量和新生代空间为代价的。**系统把新生代调的小一点,垃圾收集速度肯定快一点,但是随之而来的就是频繁的垃圾收集,因此吞吐量也会下来。
  2. -XX:GCTimeRatio:值应该是一个大于0小于100的正数,也就是垃圾收集时间总时间的比率,相当于吞吐量的倒数。比如设置为19,那么就是允许的最大垃圾收集器占用的时间为5%(即1/(1+19));默认为99,允许的最大1%(1/(1+99))为垃圾收集时间

5. Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,同样也是一个单线程收集器,使用标记-整理算法

image-20230212135752822

如果在服务端模式下,它也可能有两种用途:一种是在JDK 5以及之前的版本中与 Parallel Scavenge 收集器搭配使用9,另外一种就是作为 CMS 收集器发生失败时的后备预案,在并发收集发生Concurrent Mode Failure 时使用。


6. Parller Old收集器

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

image-20230212140005545

在Parller Old收集器没有出现之前,Parller Scavenge收集器只能和Serial Old收集器搭配使用,由于Serial Old收集器应用性能上的拖累,并不能是的Parller Scavenge收集器未必能发挥出最好的吞吐量最大化的效果。这组合甚至不如ParNew加CMS的组合来得优秀。

直到 Paraller old 收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑 Paraller Scavenge 加Paraller Old 收集器这个组合。


7. CMS 收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的 Java 应用集中在互联网网站或者基于浏览器的 B/S 系统的服务端上,这类应用通常都会较为关注服务的响应速度希望系统停顿时间尽可能短,以给用户带来良好的交互体验。

CMS收集器是基于标记-清除算法实现的。它的回收垃圾的步骤如下

  1. 初始标记

    1. 需要Stop The Word,仅仅标记从GC Roots的直接关联对象,速度很快
  2. 并发标记

    1. 从GC Roots的直接关联对象开始遍历整个对象图的过程,过程耗时但不需要停顿用户线程,可以与垃圾收集线程一起并发允许
  3. 重新标记

    1. 需要Stop The Word,为的是修正并发标记期间,因用户程序继续允许而导致标记产生变动的拿一些对象的标记记录。
    2. 停顿时间比初始标记时间常,但比并发标记时间短
  4. 并发清除

    1. 清除标记阶段判断已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以和用户进程同时运行的

image-20230212140536014

CMS的优点的优点有并发收集、低停顿。

不过CMS并没有达到完美,它有以下几个缺点

  1. CMS收集器对处理器资源非常敏感
  2. CMS无法处理浮动垃圾
    1. 由于并发标记和并发清除阶段,用户线程是继续运行的,程序在运行的时候自然会产生新的垃圾对象。
  3. 由于使用标记-清除算法实现,所以会导致空间碎片比较多。

8. Garbage First 收集器

Garbage First 收集器也成为G1收集器,它是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。

G1收集器面向堆内存任何部分来组成回收集 (Collection Set,一般简称 CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是 G1 收集器的 Mixed GC 模式。

G1开创的基于 Region 的堆内存布局是它能够实现这个目标的关键。虽然 G1 也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1 不再坚持固定大小以及固定数量的分代区域划分,而是把连续的 Java 堆划分为多个大小相等的独立区域(Region),每一个Region 都可以根据需要,扮演新生代的 Eden 空间、Survivor 空间或者老年代空间。收集器能够对扮演不同角色的 Region 采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

Region 是 G1收集器的单位回收的最小单位,这样做可以有计划避免整个JAVA堆中进行全区域的垃圾收集。并且G1收集器会跟踪各个Region的价值大小,也就是回收所获得的空间大小以及回收所需要的时间的经验值,在后台形成一个优先队列,再根据用户设定的允许的停顿时间,优先处理那些回收价值大的Region,这样保证了G1收集器在有限的时间内获取尽可能高的收集效率。

image-20230212161608985

G1收集器的运作步骤

  1. 初始标记
    1. 仅仅只是标记一下GC Roots 能直接关联到的对象并且修改 TAMS 指针的值,让下一阶段用户线程并发运行时,能正确地在可用的 Region 中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行Minor GC 的时候同步完成的,所以G1 收集器在这个阶段实际并没有额外的停顿。
  2. 并发标记
    1. 从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理 SATB 记录下的在并发时有引用变动的对象。
  3. 最终标记
    1. 对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的 SATB 记录。
  4. 筛选回收
    1. 负责更新 Region 的统计数据,对各个Region 的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个 Region 构成回收集,然后把决定回收的那一部分Region 的存活对象复制到空的 Region 中,再清理掉整个旧 Region 的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

image-20230212162540809


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu安装配置Cuda和Pytorch gpu

前言 在Ubuntu中操作系统中,通过Anconda安装对应的虚拟环境以及软件包,一般都需要适配Cuda、Pytorch版本等 以下安装配置都是在Ubuntu操作系统下 1. 安装Cuda 通过Ubuntu操作系统查看cuda适配的版本:nvidia-smi 截图如下: 查看Ubuntu版本可如下方式 (1)cat /proc/ver…

QT QOpenGLWidget使用说明(一)OpenGL 类的添加

文章目录一.Qt项目中添加OpenGL库二.添加OpenGL类Qt官网关于 QOpenGLWidget的说明: https://doc.qt.io/qt-6.2/qopenglwidget.html一.Qt项目中添加OpenGL库 cmakeList.txt中添加OpenGL库 find_package(Qt6 COMPONENTS OpenGLWidgets REQUIRED) target_link_libraries(mytarget …

Shader(向量)

单位向量向量加法向量的模向量点乘(夹角>0则在前方,反之后方)5.向量的投影6.向量的减法7.向量的叉乘(可以判断点是否在三角形内)满足AB*AP,BC*BP,CA*CP都大于0或者都小于0则P点在三角形内

STM32单片机蓝牙APP可烘干升降晾衣架带照明灯

实践制作DIY- GC0123-蓝牙APP可烘干升降晾衣架 一、功能说明: 基于STM32单片机设计-蓝牙APP可烘干升降晾衣架 功能介绍: 硬件组成: STM32F103C系列最小系统单片机1个uln2003步进电机(模拟升降)1个uln2003步进电机&a…

刘润:五维思考,让你站得更高、看得更远

原标题:刘润:五维思考,让你站得更高、看得更远 前言:遇到问题时,有的人很快就能想明白,有的人需要很久才能想明白,还有的人始终都想不明白。 而且,那些很快就能想明白的人&#xff0…

大数据之Hadoop

文章目录一、大数据概论1、大数据概念2、大数据的特点3、大数据应用场景4、大数据部门的业务流程分析5、大数据部门组织结构(重点)二、从Hadoop框架讨论大数据生态1、什么是Hadoop2、Hadoop发展历史3、Hadoop三大发行版本1.Apache Hadoop2.Cloudera Hado…

Rust学习入门--【6】Rust 基础语法

Rust 基础语法 变量,数据类型,注释,函数和控制流,这些是大部分编程语言都具有的编程概念。 本节将学习理解这些概念。 变量 Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。…

Sentinel源码解析-ProcessorSlot具体

前言 上篇文章中我们已经讲到了构造完处理链,然后会调用对应slot的entry方法,我们根据配置文件中Slot的具体顺序来逐一讲解Slot的具体实现。 一、NodeSelectorSlot 这个 slot 主要负责收集资源的路径,并将这些资源的调用路径,以…

ssm学生在线选课成绩教案管理系统java

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了教案管理系统。系统主要包括个人中心、学生管理、教师管理、公告信息管理、科目管理、课程信息管理、选课记录管理、学生成绩管理、系统管理等功能模块。结合实际项日的功能需求,从研究背景、国内发展的现状…

C++ 基础

命名空间 在 C/C 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的…

就现在!为元宇宙和Web3对互联网的改造做准备!

欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:8分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 如今,互联网是各种不同的网站、应用程序和平台的集合。由于彼此分离…

微信小程序Springboot 校园拼车自助服务系统java

系统管理员: 管理员账户管理:在线对管理员的账户信息进行管理,包括对管理员信息的增加修改以及密码的修改等。 站内新闻管理:在后台对站内新闻信息进行发布,并能够对站内新闻信息进行删除修改等。 论坛版块管理&#x…

SpringMVC--注解配置SpringMVC、SpringMVC执行流程

注解配置SpringMVC 使用配置类和注解代替web.xml和SpringMVC配置文件的功能 创建初始化类,代替web.xml 在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类, 如果找到的话就用它来配置Servle…

69. x 的平方根

文章目录题目描述二分法参考文献题目描述 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x…

pwn手记录题1

fuzzerinstrospector(首届数字空间安全攻防大赛) 主体流程(相对比较简单,GLibc为常见的2.27版本, Allocate申请函数(其中有两个输入函数Read_8Int、Read_context; 还存在着后门函数; 关键点在于如何利用…

微服务项目(mybatis与微服务注册)

目录 一、SpringBoot整合MybatisPlus 创建自动生成代码子模块 创建商品服务子模块 二、SpringBoot整合 Freeamarker 三、SpringBoot整合微服务&gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windows…

基于SpringBoot+Vue的疫苗预约管理系统(Java项目)

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、…

RabbitMQ详解(一):RabbitMQ相关概念

RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本系列是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、五种消息模…

设备管理(7)

设备管理 1 I/O硬件组成 设备的类型: 块设备:如:磁盘、磁带,块大小512B~32KB,通常为512B。块设备的特点是速度高、随机访问、I/O采用DMA。字符设备:如:键盘、行式打印机。特点是速度低、不可寻…

河道治理漂浮物识别监测系统 yolov7

河道治理漂浮物识别监测系统通过yolov7网络模型深度视觉分析技术,河道治理漂浮物识别监测算法模型实时检测着河道水面是否存在漂浮物、水浮莲以及生活垃圾等,识别到河道水面存在水藻垃圾等漂浮物,立即抓拍存档预警。You Only Look Once说的是…