JVM笔记3-经典的垃圾收集器

image.png上图展示了7种,适用于不同分代中的收集器。如果两者之间由连线,说明可以搭配使用。
PS:在JDK8中将Serial+CMS和ParNew+Serial Old的组合声明为废弃,并且在JDK9中完全取消了这两种组合的支持。

1、Serial收集器

Serial收集器是JVM中最早、最基础的一个收集器。这个收集器是一个单线程工作的收集器。采用标记复制算法。它的“单线程”并不仅仅说明它是使用一个处理器或单个收集线程去完全收集工作,更重要的是强调,在它进行垃圾收集工作时,需要将其他所有工作线程(包括用户的工作线程)全部停掉,直到它收集结束(Stop The World)。
下图所示,是Serial/Serial Old收集器的运行过程:
image.png

由于Serial收集器的简单高效(与其他收集器的单线程相比)、额外内存消耗最小的特点,Serial收集器更适合用于在单核处理器或者处理器核心较小的的环境上。

2、ParNew收集器

ParNew实际上是Serial收集器的多线程的并行版本。采用的也是标记复制算法。除了使用多线程进行垃圾收集之外,其他的行为包括Serial收集器可用的参数(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold)、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器一致。

ParNew+Serial Old收集器的运行过程:
image.png
但是由于,在JDK9版本中不在支持ParNew+Serial Old的组合,因此只有CMS才能配合ParNew使用。

在JDK5中,HotSpot发布一个跨时代的垃圾收集器,CMS收集器。这款收集器是HotSpot虚拟机中第一个支持并发的垃圾收集器,它首次实现了让垃圾收集线程和用户线程(几乎)同时工作。
但是CMS作为,老年代的垃圾收集器,CMS却不能配合Parallel Scavenge收集器一起使用。所以在选择使用CMS收集器收集老年代时,只能选择使用Serial(JDK9之后废弃)和ParNew收集器其中的一个来收集新生代。ParNew是激活CMS后(使用-XX:+UseConcMarkSweepGC)的默认新生代收集器。也可以使用-XX:+/-UseParNewGC选项来强制指定或者禁用它。但是在JDK9中,官方希望新发布的G1收集器能取代ParNew+CMS的组合来作为服务端的垃圾收集方案。并且直接取消了Serial+CMS和ParNew+Serial Old的组合支持,甚至还取消了-XX:+UseParNewGC参数。这也就意味着,ParNew和CMS从此只能搭配使用。

PS:CMS不能配合Parallel Scavenge使用的原因:
1、CMS面向低延迟、Parallel Scavenge面向高吞吐量。目标不一致。
2、Parallel Scavenge和G1收集器都没在使用HotSpot中原本设计的垃圾收集器的分带框架,而选择另外独立实现。

3、Parallel Scavenge收集器

Parallel Scavenge收集器是新生代的垃圾收集器,采用的也是标记复制算法。也是能够并行收集的多线程收集器。
Parallel Scavenge收集器关注点和其他的垃圾收集器不同,CMS等垃圾收集器关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标是达到一个可控制的吞度量。所谓的吞吐量就是处理器用户执行用户代码的时间与处理器总耗时的比值。
如果虚拟机完成某个任务,总耗时是100min,执行用户的代码时间是99min那么吞吐量就是99%。停顿时间越短,越适合需要与用户交互或者需要保证服务响应质量的程序。
Parallel Scavenge提供两个参数用户精准控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMills参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。
1、-XX:MaxGCPauseMills:允许用户设置一个大于0的毫秒数。收集器将尽量保证内存回收的时间不超过用户设定的值。但是这个值不是越短越好,垃圾收集的停顿时间是以牺牲新生代大小和吞吐量换取的。
2、-XX:GCTimeRatio:这个值是一个在0到100之间的整数。也就是垃圾收集时间占总时间的比率。相当于吞吐量的倒数。比如:将此值设置为19,那么允许最大的垃圾收集时间就占总时间的5%(即 1 / ( 1 + 19 ) 1/(1+19) 1/(1+19))。

由于和吞吐量关系密切,Parallel Scavenge收集器也经常被称为“吞吐量优先收集器”。除了上述两个参数,Parallel Scavenge还有个参数-XX:+UseAdaptiveSizePolicy。这是一个开关参数,当这个参数被激活后,就不要人工指定新生代(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大吞吐量。这种调节方式称为垃圾收集器的自适应的调节策略。

4、Serial Old收集器

Serial Old收集器是老年代版本,它同样是一个单线程的收集器。采用标记-整理算法。这个收集器和Serial收集器类似都是主要用在客户端模式下的HotSpot虚拟机中。
用在服务端模式下,可能存在两种场景:
1、在JDK5及之前的版本,与Parallel Scavenge收集器搭配使用(因为Parallel Old在JDK6才发布)。
2、作为CMS收集器发生失败时的备选方案。在并发收集发生Concurrent Mode Failure时使用。
Serial+Serial Old工作流程如图所示:
image.png

5、Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多线程并发收集。也是基于标记-整理算法。
这个收集器是JDK6才提供的。在之前的版本中,如果想使用Parallel Scavenge收集器,老年代只有Serial Old收集器可供选择。其他表现良好的收集器,如CMS无法搭配他使用(无法搭配使用的原因在本章ParNew收集器中介绍)。
由于Serial Old收集器在服务端应用性能上的“拖累”,使用Parallel Scavenge收集器也未必能在整体上获得吞吐量最大化的效果。
直到Parallel Old的出现,“吞吐量优先”收集器才有了名副其实的搭配组合。在注重吞吐量或者处理器资源比较稀缺的场合,都可以优先考虑Parallel Scavenge+Parallel Old收集器这个组合。
Parallel Scavenge+Parallel Old的工作流程如下:
image.png

6、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。常常用来注重服务的响应速度这类应用上的。与前面介绍的5中收集器都不同,CMS采用的是标记-清楚算法。

CMS的整个运行过程,相比较于前面的几种收集器,更加的负责,整个过程可以分为以下4个步骤:
1、初始标记(CMS initial mark)
2、并发标记(CMS concurrent mark)
3、重新标记(CMS remark)
4、并发清楚(CMS concurrent sweep)

其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记只是标记一下GC Roots能直接到达的对象,速度很快。并发标记阶段就是从GC Roots的直接关联对象遍历整个对象图的过程,这个过程耗时比较长,但是不需要停顿用户线程。重新标记阶段,则是为了修正在并发标记阶段由于程序运行而产生变动的那一部分标记记录。这个阶段的停顿时间通常会比初始阶段稍长一些,但是也远比并发标记阶段短。最后是并发清除阶段,清理删除掉标记阶段判断死亡的对象,由于不需要移动存活对象,所以这个阶段可以和用户线程一起执行。
在整个CMS的工作流程中,并发标记和并发清除是耗时最长的,在其他时候,垃圾收集器都是可以与用户线程一起工作的。所以从总体上来看,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS的执行流程入下图所示:
image.png
由于CMS在并发清理阶段,用户线程是可以正常运行的,程序正常运行期间会产生新的垃圾对象。且这些新的垃圾对象时在标记之后产生的,因此CMS无法在当次收集时清理掉他们。只能留待下一次垃圾清理时清理。这一部分垃圾被称为“浮动垃圾”。
同样的,由于用户线程是正常运行的,那就需要预留够足够的空间,以便用户线程使用。也就是说CMS不能在老年代几乎被填满的时候,进行垃圾收集,必须留一部分空间供并发收集时的程序使用。在JDK5的默认设置中,CMS收集器当老年代使用了68%的空间后就被激活。这是一个保留的设置,当老年代增长不是太快时,可以适当调高参数-XX:CMSInitiatingOccupancyFraction的值来提高CMS的触发百分比,降低内存的回收频率,获取更好的性能。
到了JDK6,默认的百分比已经提高到了92%。但这又面临另一种风险:要是CMS运行期间预留的内存空间无法满足程序分配对象的需要,就会出现一次“并发失败(Concurrent Mode Failure)”,这时候虚拟机就会启动后背预案:冻结用户线程,临时采用Serial Old收集器来重新进行老年代的垃圾收集,但这样停顿时间会很长。因此参数-XX:CMSInitiatingOccupancyFraction设置的太高将会容易导致大量的并发失败产生,性能反而会降低。
CMS采用的是并发清理算法,这个算法有个最大的缺点:会产生大量的空间碎片。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现,命名老年代有很多剩余空间,但是无法找到足够大的连续空间来分配当前对象,而不得不触发一次FULL GC。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

护士节趣味互动h5小游戏的作用是什么

护士节也同样气氛满满,护士总量非常高,针对此群体不少行业都可借势营销,为自己的生意及品牌赋能,奖品吸引用户参与,趣味形式及控件达成多种效果。 在【雨科】平台拥有多款护士节互动小游戏类型,页面元素/背…

5000亿参数来了:微软将推出 MAI-1 模型硬刚谷歌和OpenAI|TodayAI

美国的科技巨头微软公司,正在积极扩展其人工智能(AI)技术的领域。最新消息显示,微软将推出一款名为MAI-1的全新AI模型,其规模巨大,预计将拥有5000亿个可调参数。这一开发工作由Inflection AI的CEO穆斯塔法苏…

SpringBoot 扩展篇:ConfigFileApplicationListener源码解析

SpringBoot 扩展篇:ConfigFileApplicationListener源码解析 1.概述2. ConfigFileApplicationListener定义3. ConfigFileApplicationListener回调链路3.1 SpringApplication#run3.2 SpringApplication#prepareEnvironment3.3 配置environment 4. 环境准备事件 Config…

社交媒体数据恢复:抖音、火山版、极速版

抖音是一款非常受欢迎的短视频社交平台,在使用过程中,有时候我们会不小心删除了重要的聊天记录。那么,如何恢复抖音聊天记录呢?下面,我将为大家带来一份详细的抖音聊天记录数据恢复教程。 一、抖音聊天记录恢复方法 打…

Angular中组件之间的传值

Angular中组件之间的传值 文章目录 Angular中组件之间的传值前言一、父亲向儿子传值二、儿子向父亲传值三、爷爷向孙子传值四、兄弟之间的传值 前言 Angular的组件是构成应用的基础单元,它们封装了HTML模板、TypeScript代码以及CSS样式,以实现特定的功能…

【算法学习】day2

文章目录 BFS1.图像渲染2.岛屿数量 BFS 1.图像渲染 思路:BFS宽度遍历,我们需要对初始像素进行一层一层遍历,也就是上下左右四个方向进行遍历判断,如何访问这四个方向呢,就需要利用两个数组dx和dy来进行判断和遍历&…

【RPC】Dubbo接口测试

关于rpc,推荐看看这篇 : 既然有HTTP协议,为什么还要有RPC 一、Dubbo 是一款alibaba开源的高性能服务框架: 分布式服务框架高性能和透明化的RPC远程服务调用方案SOA服务治理方案 二、Dubbo基础架构 三、 Dubbo接口测试 1、jme…

毕业设计参考-PyQt5-YOLOv8-鱼头鱼尾鱼长测量程序,OpenCV、Modbus通信、YOLO目标检测综合应用

“PyQt5-YOLOv8-鱼头鱼尾鱼长测量程序”是一个特定的软件程序,用于通过图像处理和目标检测技术来测量鱼类的长度。 视频效果: 【毕业设计】基于yolo算法与传统机器视觉的鱼头鱼尾识别_哔哩哔哩_bilibili 这个程序结合了多种技术: 1. OpenCV…

并行执行的概念—— 《OceanBase 并行执行》系列 一

From 产品经理: 这是一份姗姗来迟的关于OceanBase并行执行的系统化产品文档。 自2019年起,并行执行功能已被许多客户应用于多种场景之中,其重要性日益凸显。然而,遗憾的是,我们始终未能提供一份详尽的用户使用文档&…

如何应对访问国外服务器缓慢的问题?SDWAN组网是性价比之选

访问国外服务器缓慢通常由以下原因造成: 1、政策限制:我国管理互联网,限制部分国外网站和服务器,以维护国家安全稳定。 2、技术障碍:国内与国际互联网的网络架构和协议存在差异,可能导致数据传输不兼容。 …

探索AI编程新纪元:从零开始的智能编程之旅

提示:Baidu Comate 智能编码助手是基于文心大模型,打造的新一代编码辅助工具 文章目录 前言AI编程概述:未来已来场景需求:从简单到复杂,无所不包体验步骤:我的AI编程初探试用感受:双刃剑下的深思…

docker资源限额

多数的应⽤场景要对Docker容器的运⾏内存进⾏限制,防⽌其使⽤过多的内存。 格式:-m或--memory 正常的内存大小 [rootadmin ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

“40法则”视角下的中国网络安全公司

“40法则”视角下国内网安上市公司2023年业绩表现 采用“40法则”衡量,首先需要考虑的是营收增长和利润水平的衡量指标,在上一篇文章中已经详细说明,在此不再赘述。 增长速度的衡量指标,可以选择公司的营业收入的同比增长率。 …

华为OD机试 - 掌握的单词个数 - 回溯(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

怎么将pdf的文件内容保存到mysql数据库中?

要将PDF导入到MYSQL,首先一步就是要先将PDF内容结构化,如果其内容为非结构化,则导入MYSQL的意义不大,具体操作方法如下: 将PDF文件的内容保存到MySQL数据库中通常涉及几个步骤。PDF文件包含的是格式化文本、图像和其他…

​XMall商城微信小程序前端技术解析

摘要 随着移动互联网的深入发展,微信小程序以其轻量级、便捷性和即用即走的特点,成为了众多企业和开发者关注的焦点。XMall商城微信小程序前端作为一款开源项目,以其精美的页面设计、丰富的功能和高效的性能,受到了广大开发者和用…

深度学习之基于Matlab BP神经网络烟叶成熟度分类

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 烟叶的成熟度是评估烟叶品质的重要指标之一,它直接影响着烟叶的口感、香气和理化特性。传…

还不懂 RESTful 接口是什么?快进来看看

RESTful是指基于REST(Representational State Transfer,表现层状态转移)架构风格的Web服务。REST是一种设计原则和架构风格,而不是标准,它用于指导如何构建易于交互、高效、可扩展的网络系统。RESTful服务通常使用HTTP…

Oracle Database 23ai Free RPM Installation On Oracle Linux 8 (OL8)

Oracle刚刚发布了最新的Oracle database 23ai版本测试安装包,有兴趣的小伙伴可以安装体验一下。 关于安装的介质可以去如下地址下载: Oracle linux 8.9 Oracle Linux ISOs | Oracle, Software. Hardware. Complete. Oracle database 23ai安装包 Get Star…

Read timed out. (python 安装第三方库超时)

不少人在安装python第三方库的时候经常发生下面情况 解决方法就是往上找 我这里就是 jupyterlab-4.1.8-py3-none-any.whl安装时间过长,失败 那就去国内镜像网站下载下来离线安装 https://pypi.tuna.tsinghua.edu.cn/simple/xxx(xxx就是你的包名&#…