JVM(五、垃圾回收器)

 经典的垃圾回收器大概有7种,这些收集器的目标、特性、原理、使用场景都有所区别,有的适用于年轻代,有的适用于老年代,图中展示的就是这7中垃圾回收器,如果两个垃圾回收器有连线,则表明可以配合使用。这个关系不是一成不变的,Serial+CMS、 ParNew+Serial Old本来也可以组合的,在JDK8、JDK9被声明废弃和取消。这篇文章主要讨论CMS、G1

1、Serial收集器

 Serial收集器是最基础、历史最悠久的收集器,是一个单线程工作的收集器,单线程并不仅仅说明它只会使用一个处理器或者一条线程区完成垃圾收集工作,更重要的是它在垃圾回收时,必须暂停用户进程,Stop The World。

适用场景:客户端模式下新生代收集器 

Serial虽然是单线程的,也是有优于其他收集器的地方,简单高效,对内存资源受限的环境,额外消耗内存最小的,所以适用于客户端模式的新生代。

2、ParNew收集器

ParNew是serial的多线程并行版本,除了使用多条线程进行垃圾收集之外,其他和Serial都一样。

 使用场景:JDK7之前遗留系统的首选新生代收集器

 其中有一个与功能、性能无关但其实很重要的原因是:除了Serial收集器外,目前只有它能与CMS 收集器配合工作。

3、Parallel Scavenge收集器

Parallel Scavenge收集器同样是新生代收集器,基于标记-复制算法实现,也是并行收集。Parallel Scavenge的目标是达到一个可控制的吞吐量

 

        如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。停顿时间越短就越适合需要与用户交互或需要保证服务响应质量的程序,良好的响应速度能提升用户体验;而高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务。
        Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。
        Parallel Scavenge收集器还有一个参数-XX:+UseAdaptiveSizePolicy值得我们关注 这是一个开关参数,当这个参数被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时 间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应的调节策略

4、Serial Old收集器

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

 使用场景:客户端模式

5、Parallel Old收集器

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

Parallel Old 收集器是直到JDK 6 时才开始提供的,在此之前,新生代的 Parallel Scavenge 收集器一直处于相当尴尬的状态,原因是如果新生代选择了Parallel Scavenge 收集器,老年代除了 Serial Old PS MarkSweep)收集器以外别无选择,其他表现良好的老年代收集器,如 CMS 无法与它配合工作。由于老年代Serial Old 收集器在服务端应用性能上的 拖累 ,使用 Parallel Scavenge 收集器也未必能在整体上获得吞吐量最大化的效果。
        直到Parallel Old 收集器出现后, 吞吐量优先 收集器终于有了比较名副其实的搭配组合,在注重 吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge Parallel Old 收集器这个组合。

 

 6、CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器,目前集中运行在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用关注服务的响应速度,希望系统停顿时间尽可能短,CMS适用这种场景。CMS基于标记-清除算法实现。

CMS收集过程四个步骤:

  1. 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清除

初始标记重新标记需要Stop The World

初始标记:只是标记一下GC Root能直接关联的对象,速度很快。

并发标记:从GC Root能直接关联的对象开始,遍历整个引用链,这个过程虽然时间长,但是不需要停顿用户进程。

重新标记:修正并发标记期间,用户程序继续运行而导致编辑产生那一部分对象的标记记录,修正期间也是Stop The World。

并发清除:删除标记阶段判断已经死亡的对象,由于不需要移动存活对象,所以不需要停顿用户进程。

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

7、G1收集器

在G1出现之前,其他的收集器目标范围都是整个新生代或者整个老年代,或者整个Java堆,而G1跳出了整个限制,面向堆内存任何部分来组成回收集进行回收,标准不再是哪个分代,而是那块内存中存放的垃圾数量最多,回收收益最大。
G1是基于Region的堆内存布局来实现任何内存部门来回收,把Java堆划分为多个大小相等的独立区域(Region),每个区域都可以根据需要扮演Eden、Survivor或者是老年代
Region中还有一类特殊的Humongous区域,专门存储大对象,只要超过一个Region容量的一半,就会判定为大对象,Region的大小可以通过参数-XX:G1HeapRegionSize设

定,取值范围为1MB~32MB。

G1回收过程四个步骤:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雅思阅读TFNG题型7大解题思路

雅思阅读TFNG题型7大解题思路,全在这了‼️ ⚠️在徘徊在6-6.5的同学有很大的共性就是对题型不够熟悉,我记得我当时卡6.5的时候我有时候分不清NG和F,有时候又分不清NG 和True,也不知道他有哪几种考我的方法,脑子里没有…

Nuxt3:拉取项目模板失败问题解决方法

问题描述 使用官网提供的命令npx nuxilatest init <project-name> 创建Nuxt3项目时&#xff0c;遇到了拉取项目模板失败的问题&#xff0c;报错信息如下 先分析一下这行命令在做的事情&#xff0c;结合之前的经验来看&#xff0c;似乎是在尝试通过该网址返回的元数据信息…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

MybatisPlus之1:快速入门

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

「甲子光年」对话黄翔:从电子签回望中国SaaS“黄金十年”

法大大成立十周年之际&#xff0c;联合「甲子光年」重榜发布《中国电子签十年风云录》&#xff0c;通过应用者、从业者、观察者的不同视角&#xff0c;记录电子签乃至时代发展的风云十年。本期是刊物精彩内容呈现的第一期&#xff0c;扫描下图可获取电子版。 创立法大大之前&am…

【Three.js基础学习】28.Coffee Smoke

前言 /* 补充&#xff1a;材质本身纹理有光源等信息因此能看到模型 gltf.scene.traverse((child) > { if (child.isMesh) { child.material.map null; // 移除贴图 } }); 此时是纯白色&#xff0c;按照正常逻辑 没有光会是灰/黑色 为什么显示白色 1.默认材质颜色 2.材质的表…

Linux(命令行扩展+命令行历史 大白话+图片)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

渗透测试---shell(5)字符串运算符与逻辑运算符

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 目录 一、字符串运算符 创建u.sh文…

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…

游戏陪玩系统开发功能需求分析

电竞游戏陪玩系统是一种专门为游戏玩家提供陪伴、指导和互动服务的平台。这类系统通常通过专业的陪玩师&#xff08;也称为陪练师&#xff09;为玩家提供一对一或多对一的游戏陪伴服务&#xff0c;帮助玩家提升游戏技能、享受游戏乐趣&#xff0c;甚至解决游戏中的各种问题。电…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…

如何删除Kafka中的数据以及删除topic

如何删除Kafka数据已经以及删除topic呢&#xff1f; 1、删除数据 先启动Kafka实例 docker exec -it kafka-0 /bin/bash #进去容器 rm -rf /bitnami/kafka/data/* #删除数据 exit #退出如果删除失败&#xff0c;可能是数据不存在于/bitnami/kafka/data&#xff0c;使用 cd /o…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

【2024最新】基于springboot+vue的疫情网课管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…