JVM 垃圾收集算法

首先我们要知晓,垃圾收集是建立在两个分代假说之上的:

①弱分代假说:绝大多数对象都是朝生夕灭的

②强分代假说:熬过越多次垃圾收集的对象就越难消亡

收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄分配到不同的区域中存活。

给出收集的几个名词,以便于大家看文章:

部分收集(Partial [ˈpɑːʃl] GC):指目标不是完整后记整个Java堆的垃圾收集。

其中又细分为:

新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。

老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。

请注意“Major GC”这个说法现在有点混淆,在不同资料上常有不同所指, 读者需按上下文区分到底是指老年代的收集还是整堆收集

混合收集(Mixed GC):指目标是收集整个新生代及部分老年代的垃圾收集,目前只有G1垃圾收集器有这种行为。

整堆收集(Full GC):收集整个Java堆和可能会触发方法区的垃圾收集。

1.标记—清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来标记存活的对象,然后回收违背标记的对象。

第一步、找到内存中需要被回收的对象,并且把它们标记出来。

此时堆中的所有对象都会被扫描一遍,从而才能确定需要回收的对象,比较耗时。

第二步、清除掉被标记需要回收的对象,释放出对应的内存空间。

注意:这里所谓的清除并不是真的置空,而是把需要清除对象的地址回收到空闲的地址列表里,下次有新对象需要加载时,直接使用这些地址即可,也就相当于一个覆盖的过程。(这是别的八股文所没有介绍的)

缺点:

(1)标记和清除两个过程都比较耗时,效率不高 。

(2)会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

2.标记—复制算法

将可用内存分为两块,每次只用一块,用完时将这一块还存活的对象复制到另一块上,然后一次性清空这一块。

缺点:空间利用率降低,浪费空间。

3.标记—整理算法

我们发现第一种算法会导致碎片化,第二种算法又浪费内存空间,于是出现了第三种:

第一步、标记(标记的过程仍然与“ 标记-清除”算法一样),但是后续步骤不是直接对可回收对象进行清理。

第二步、将所有的存活对象压缩到内存的一端,按顺序排放之后,清理边界外所有的空间。

优点:没有碎片化,也不浪费内存空间。

缺点:但是效率比较低,甚至比标记复制更低。

4.分代收集

从垃圾收集算法到如今,只有这三种垃圾回收器算法,如果算上分代收集算法就是四种。

每种垃圾回收算法都有缺点,要是把你的内存当成一整块的时候,无论你采用什么样的算法,都有它自己的问题,所以垃圾回收器非常聪明,他是用这三种算法综合运用,然后同时对内存进行了划分,产生了各种各样的不同的垃圾回收器。

其实这里背后是有分代收集的理论作为支撑的,开发者记录了所有的对象的生命周期,

其一、发现绝大多数对象都是“寄蜉蝣于天地,渺沧海之一粟”。(弱分代假说)

其二、熬过越多次垃圾收集过程的对象就难以消亡(强分代假说)。

这两个现象奠定了垃圾收集器的一致的设计原则:收集器应该将内存划分出不同的区域,然后将回收的对象依据其年龄(年龄既是对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。如果一个区域中大多数对象都是朝生夕死的,难以熬过垃圾收集器过程,那么将它们集中在一起,每次回收只关注保留下存活的对象而不是去标记那些大量的将要被回收的对象,就能以最小的代价会回收到大量的空间;如果剩下的都是难以消灭的对象,那么把他们集中在一起,虚拟机就可以使用较低的频率来回收这个区域,就兼顾了时间开销和内存空间的有效利用。

Java虚拟机设计者一般会把Java堆分为新生代(Young Generation)和老年代(Old Generation)

在新生代中,每次垃圾收集 时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。

动态对象年龄判定:(虚拟机并不会永远地要求对象的年龄都必须达到MaxTenuringThreshold才能晋升老年代,如果Survivor空间中相同年龄的所有对象的大小总和大于Survivor的一半,年龄大于或等于该年龄的对象就可以直接进入老年代),空间分配担保,老年代的连续空间大于(新生代所有对象的总大小或者历次晋升的平均大小)就会进行minor GC,否则会进行full GC。

不同区用什么算法:

Young区:复制算法(对象在被分配之后,可能生命周期比较短,Young区复制效率比较高)

Old区:标记清除或标记整理(Old区对象存活时间比较长,复制来复制去没必要,不如做个标记再清理)

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

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

相关文章

武汉工程大学24计算机考研数据,有学硕招收调剂,而专硕不招收调剂!

武汉工程大学是一所以工为主,覆盖工、理、管、经、文、法、艺术、医学、教育学等九大学科门类的多科性教学研究型大学,是湖北省重点建设高校、湖北省国内一流学科建设高校,入选卓越工程师教育培养计划、中西部高校基础能力建设工程、“新工科…

spring boot接入nacos 配置中心

再接入nacos配置中心时,需要确认几点: 1. spring boot 版本 (spring boot 2.x ) 2. nacos 配置中心 服务端 版本 (1.1.4) 3. nacos client 客户端版本 (1.1.4) 方式一 1. 启动 nacos 服务端,这里不做解释 在配置中心中加入几个配置 2. 在…

吴恩达机器学习 第三课 week1 无监督机器学习(下)

目录 01 学习目标 02 异常检测算法 2.1 异常检测算法的概念 2.2 基于高斯模型的异常检测 03 利用异常检测算法检测网络服务器的故障 3.1 问题描述 3.2 算法实现 3.3 问题升级 04 总结 01 学习目标 (1)理解异常检测算法(Anomaly Dete…

六爻排盘神机

选修课留了3000字的论文......确实,削微有那么一点小困难…… 但是,倘若我拿出已经占了6419个字符的 “六爻排盘神机” ,阁下…应该…不会…骂我吧 且看,六爻排盘神机! import random import datetime from lunarcale…

FlashAttention-2 论文阅读笔记

FlashAttention-2是对原始FlashAttention算法的一系列改进,旨在优化在GPU上的计算性能。本节详细讨论了FlashAttention-2的算法、并行性以及工作分区策略。 算法 FlashAttention-2的关键优化点在于减少非矩阵乘法(matmul)的浮点运算&#x…

详解工业网关在线探测功能及用途

详解工业网关在线探测功能及用途 工业网关作为工业物联网(IIoT)架构中的关键组件,扮演着桥梁的角色,它连接了现场的各类传感器、执行器以及更高级别的云平台或企业系统。在线探测功能是工业网关诸多能力中的一项重要特性&#xf…

2024年文化、艺术设计与社会科学国际学术会议(ICCADSS 2024)

2024年文化、艺术设计与社会科学国际学术会议(ICCADSS 2024) 重要信息 会议官网:http://www.iccadss.com 会议地址:北京 收录检索:EI,CPCI,CNKI,Google Scholar 投稿邮箱:society_info163.com 投稿标题&am…

Swagger的基本使用(快速入门)

目录 一、环境配置 (1)导入依赖:(一般导入依赖都会报错,所以大家也可以借鉴一下这篇文章:swagger配置报错) (2)启动类添加注解 二、Swagger配置介绍 (1)基本配置 (2)设置扫描的包 三、Swagger常用注解 (1)@Api (2)@ApiOperation (3)@ApiParam (…

clean code-代码整洁之道 阅读笔记(第十一章)

第十一章 系统 “复杂要人命,它消磨开发者的生命,让产品难以规划、构建和测试。” --RayOzzie,微软公司首席技术官 11.1 如何建造一个城市 每个城市都有一组组人管理不同的部分,有些人负责全局,其他人负责细节。 城市能运转&#…

如何解决 torch.cuda.is_available()是False

目录 1. 问题2. 解决方法2.1 安装torch的CUDA版本2.1.1 查看安装的torch是什么版本2.1.2 下载GPU版本的torch 2.2 安装 NVIDIA CUDA2.2.1 下载CUDA Toolkit2.2.2 安装CUDA Toolkit 最终效果 1. 问题 在Python中,使用Pytorch时,往往会选择使用CUDA模块&a…

行业唯一!三翼鸟场景品牌战略推动价值凸显

文 | 智能相对论 作者 | 佘凯文 当你的一只羊跑进别人的羊群中,怎么才能找到它? 从前人们为了区分自己的财产,会用烧红的铁块印在动物身上作为标记。在中世纪的欧洲,手工艺匠人用这种烧灼的方法在自己的手工艺品上烙下标记&…

「Python-docx 专栏」docx 设置页面边距、页眉页脚高度

本文目录 前言一、docx 页面边距在哪里二、对 <w:pgMar> 的详细说明1、上边距的说明2、右边距的说明3、下边距的说明4、左边距的说明5、页眉高度的说明6、页脚高度的说明三、设置 docx 页边距、页眉页脚高度1、完整代码2、代码执行效果图四、补充一些内容1、页面边距的两…

AI风险的优先级划分

AI 风险的优先级划分是一个复杂的过程&#xff0c;需要考虑多个因素。以下是一些常见的考虑因素和方法&#xff1a; 风险的可能性&#xff1a;评估 AI 系统产生风险的概率。高可能性的风险通常应被视为更高优先级。 风险的影响&#xff1a;考虑风险对人类、社会、环境或其他方面…

[面试题]RabbitMQ

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

Python里引用了time包后,不能再命名time变量了吗?

在Python中&#xff0c;一旦你使用import语句导入了某个模块&#xff08;比如time模块&#xff09;&#xff0c;你就不能再使用相同的名字&#xff08;在这个例子中是time&#xff09;来命名变量、函数或其他任何东西。这是因为导入的模块会被加入到当前的命名空间中&#xff0…

全面解析:C# 委托的实质性应用与优势

有人问C#的委托&#xff08;Delegate&#xff09;有什么实质性用途?委托在C#其实是无处不在&#xff0c;那么它具体用在那里呢&#xff1f;。 本文将从委托&#xff08;Delegate&#xff09;定义和演变讲起&#xff0c;让大家一目了然。 C#的委托&#xff08;Delegate&#…

【学习笔记】Elastic-Job和Quartz 实现企业级定时任务

Elastic-Job和Quartz 实现企业级定时任务 知识拆解框架整合Java高级玩法定时任务案例 第1章 课程介绍 课程的总体介绍&#xff0c;定时任务的应用场景和发展趋势&#xff0c;以及分布式走时任务的介绍 1-1、导学 1-2、为什么学习定时任务 1-3、定时任务技术发展趋势 1-4、主…

成为AIGC人才,是职场人当下的必修课?

随着科技的飞速进步&#xff0c;人工智能和机器学习技术正逐渐渗透到我们生活的每一个角落&#xff0c;其中&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;更是以其独特的魅力和广泛的应用前景&#xff0c;成为当下科技领域的热门话题。在这样的背景下&#xff0c;…

Matlab个性化绘图第3期—带三维球标记的折线图

前段时间有会员在群里问该如何绘制下面这种带三维球标记的折线图&#xff1a; 本期内容就来分享一下带三维球标记的折线图的Matlab绘制思路。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…

【Android面试八股文】你能详细讲讲你在APK瘦身方面都做了哪些工作吗?

文章目录 一、我用到过的方法二、扩展阅读 其他的大厂方案一、我用到过的方法 面试官: 你能详细讲讲你在APK瘦身方面都做了哪些工作吗? 你: 在过去的项目中,我做了多方面的优化来减少APK的大小,从而提升应用的下载速度和安装体验。以下是一些具体的措施和技术实现: 移除不…