分代收集 + 垃圾回收算法

news2024/9/25 1:38:41

分代假说

1. 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的

2. 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡

3. 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数

💛 收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

显而易见,如果一个区域中大多数对象都是朝生夕灭,难以熬过垃圾收集过程的话,那么把它们集中放在一起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象(解释1),就能以较低代价回收到大量的空间;如果剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用(解释2)。

 解释1:

 解释2:

        时间开销 ——> 支取扫描1%,比扫描99%快得多;
        内存空间有效利用 ——> 1%移动时不会直接移动,而是复制一份,将复制移动过去,成功后,删除原有的。


新生代 —— 存放朝生夕死的对象

老年代 —— 存放新生代回收后还存活的对象,不容易死的对象

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

 解释3:

 当年龄达到13时,就进入老年代


跨代引用

分代收集有一个问题:跨代引用

比如说新生代中有一个对象A引用老年代的一个对象 B,只要老年代的对象不回收,新生代的这个对象也不会被回收。每次新生代回收时还是要去扫(判断A是否需要回收,此时也需要去判断A引用的B是否被回收),也不能直接将A放入老年代,因为可能在A的年龄为12时,对象B就被回收了。

解决跨代引用的问题

💛 存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。

举个例子,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生代对象在收集时同样得以存活,进而在年龄增长之后晋升到老年代中,这时跨代引用也随即被消除了。

跨代引用只占极少数,就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构(该结构被称为“记忆集”,Remembered Set)。这个结构把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用。
一旦出现跨代引用,就会出现在老年代的跨代引用区域。当发生新生代收集时,只有包含了跨代引用的小块内存里的对象会进行扫描。

虽然这种方法需要在对象改变引用关系(如将自己或者某个属性赋值)时维护记录数据的正确性,会增加一些运行时的开销,但比起收集时扫描整个老年代来说仍然是划算的。

垃圾回收算法

一、标记-清除算法

标记:哪些对象可以存活或者哪些对象可以回收

它的主要缺点有两个:

  • 第一个是执行效率不稳定。
    如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;

  • 第二个是内存空间的碎片化问题。
    标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

基本不使用

二、标记-复制算法

根据IBM研究,新生代中的对象有98%熬不过第一轮收集(普通场景下,无法保证每次都是这样),因此不需要按照1:1的比例来划分新生代的内存空间,而是使用了8:1:1分配内存空间。

 每次进行收集时,将前8:1空间的存活对象一次性复制到另外的1比例,然后清理掉前8:1空间的朝生夕死的对象。

💛 内存的分配担保好比我们去银行借款,如果我们信誉很好,在98%的情况下都能按时偿还,于是银行可能会默认我们下一次也能按时按量地偿还贷款,只需要有一个担保人能保证如果我不能还款时,可以从他的账户扣钱,那银行就认为没有什么风险了。

标记-复制算法虽然弥补了标记-清除算法的缺点,但标记-复制算法还是有自己的缺点:

首先就是在对象存活率较高时要进行较多的复制操作,效率将会降低

还有一种情况,就是在十分之九的的对象里超过十分之一存活,那么复制到右边区域时空间大小就不够了。

为了解决这些,出现了标记-整理算法。

三、标记-整理算法

标记过程仍与标记-清除算法相同,但后续让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

弊端

  • 像在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序(解释4)才能进行 ——> 宕机 stop the world 

但不移动的话,碎片化问题严重,得不到解决也会导致性能、存储量降低。

解释4:

如果不暂停的话,刚标记的时候只占据一块,标记完以后整理时可能就变成了占据了两块。

💛 通常标记-清除算法也是需要停顿用户线程来标记、清理可回收对象的,只是停顿时间相对而言要来的短而已。

于是混合式出现了,让虚拟机平时多数时间都采用标记-清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经大到影响对象分配时,再采用标记-整理算法收集一次,以获得规整的内存空间。

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

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

相关文章

网工软考 | 软考改机考,解读你最关心的5个问题

2023年下半年软考改为机考后,后台收到了很多的留言,大家对于实行机考的疑问还是有很多,例如要不要画图,用的什么输入法,报名费会不会涨价等。 今天就给大家解答一波。 01 软考改机考FAQ Q:软考机考会不会随…

华为内部,提拔项目经理的等级依据

大家好,我是老原。 最近和朋友吃饭,都在聊项目化,企业转型…… 要知道,一件事一旦到了饭桌上成了谈资,就说明它的趋势已经形成了。 这同时也表示,市场对项目经理的要求更高了。 早在2009年的高端项目经…

【eNSP】交换机(vlan和vlan间通信)

【eNSP】交换机(vlan和vlan间通信) 原理术语过程 实验根据图片连接模块配置设备名称和IP地址配置交换机交换机链路指定sw1配置sw2配置 设置网关交换机互联实验设置查看设置结果 ospf配置 原理 HUB集线器:它的作用可以简单的理解为将一些机器…

信捷 XDH Ethercat 高速计数器计数准确性

本人在X0,X1连手轮(手轮刻度100),CNT_AB指令使用高速计数器HSC0,出现了计数值不对。 转1圈应该有计数值变化400,实际变化只有50左右,有时多于50,有时少于50。 检查发现SFD320等于4,是正确的,百般不得其解…

AI 与智能化 API 治理的探索实践

7月 Eolink 受邀参加 QECon 2023 全球软件质量&效能大会(北京站)。Eolink CEO 刘昊臻,发表了主题为**「AI 与智能化 API 治理的探索实践」**的演讲,分享 Eolink 在 API 全生命周期中治理实践与 AI 结合的探索。 Eolink 作为国…

String trim方法,使用前需要判空

背景是接口导入时,部分字段因为手动录入可能误输空格,所以需去掉前后空格,这些属性为非必填,所以未校验非空,引发空指针异常。 代码类似这样,未判断是否为空,直接trim,导致空指针异常 Testpubl…

【JVM】运行时数据区——自问自答

Q:Java 运行时数据区解构,哪些数据线程独占,哪些是线程共享?每个区域会产生GC和异常吗? 运行时数据区: 1、PC寄存器 2、堆区 3、JVM栈 4、Native栈 5、方法区 其中,PC寄存器、Native栈、JVM栈是线程独占的…

【Spring专题】Spring之Bean生命周期源码解析——阶段四(Bean销毁)(拓展,了解就好)

目录 前言阅读建议 课程内容一、Bean什么时候销毁二、实现自定义的Bean销毁逻辑2.1 实现DisposableBean或者AutoCloseable接口2.2 使用PreDestroy注解2.3 其他方式(手动指定销毁方法名字) 三、注册销毁Bean过程及方法详解3.1 AbstractBeanFactory#requir…

python列表笔记,python列表用法及基础操作

列表的介绍 定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗? 答: 列表 一、列表的格式 定义列的格式:[元素1, 元素2, 元素3, ..., 元素n] 变量tmp的类型为列表 tmp [xiaoWang,180, 65.0] 列…

数模论文写作细节要求

目录 优秀论文必要条件 数学建模的基本思路 第一步:了解问题——查文献、找数据 第二步:阐述要解决什么问题、用什么方法 其余步骤:给出数学模型、计算求解、对比结果与真实情况、应用于现实问题。 使用某种数学方法的理由和依据 创…

【SAP-MDG】MDG配置-配置工作流任务 Configure Workflow Tasks

一、配置工作流任务的前提: 1.工作流能启动的常规设置已设置完毕;(前面提到的内容) 2.配置目录:SPRO→SAP NetWeaver→Application Server→Business Management→SAP Business Workflow.(SPRO→SAP NetW…

Splashtop:适合旅行办公人士的远程工作解决方案

无论是重要的商务旅行,还是旅游度假,还是数字游牧生活方式的诱惑,许多人都会发现自己在机场贵宾室制作演示文稿,在古雅的咖啡馆参加虚拟会议,或者在偏远海滩的宁静背景下集思广益。 随处远程办公的生活让人向往。尽管…

5G科技防汛,助力守护一方平安

“立秋虽已至,炎夏尚还在”,受台风席卷以及季节性影响全国多地正面临强降水的严峻挑战。“落雨又顺秋,绵绵雨不休”,正值“七下八上” 防汛关键时期,贵州省水文水资源局已全面进入备战状态。 为确保及时响应做好防汛抢…

Linux SIGCHLD信号

在子进程结束之后,会默认给父进程发送SIGCHLD信号。 有以下代码: 编译并运行以上代码: 可以看到在子进程结束之后,将SIGCHLD信号发送给了父进程,然后输出SIGCHLD信号的代号17。 在后台运行以上代码并查看进程信息&am…

IDEAdebug调试时查看时间戳和Date类型的对象,格式化为yyyy-mm-hh

平时debug时遇到Date或者时间戳时看时间不好判断到底是几月几号,希望直接格式化为想要的格式 比如 下面,Date直接显示为 yyyy-mm-hh的格式 解决方案: 无需下载插件,如图 //Date格式化 return new SimpleDateFormat("…

SIP网络音频模块SV-2401V网络对讲音频模块(支持POE)

功能和特点 音频工作方式: 音频解码:即音频播放。接收来自网络的音频流,经过模块解码后通过线路输出高质量音频信号。目前支持可以播放以下音频格式:MP3、WAV (PCM IMA ADPCM)、G.711、G.722等,可以播放最高48k采样率…

汽车租赁管理系统/汽车租赁网站的设计与实现

摘 要 租赁汽车走进社区,走进生活,成为当今生活中不可缺少的一部分。随着汽车租赁业的发展,加强管理和规范管理司促进汽车租赁业健康发展的重要推动力。汽车租赁业为道路运输车辆一种新的融资服务形式、广大人民群众一种新的出行消费方式和…

每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)

今日份题目: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…

全网最全的IntelliJ IDEA中快捷键大全,JetBrains公司IDE工具Windows快捷键大全,idea、pycharm快捷键大全

文章目录 前言零、工具的优点0.1快速修复0.2代码自动补全0.3实时模板0.4显示历史版本0.5调试功能 一、Ctrl二、Alt三、Shift四、Ctrl Alt五、Ctrl Shift六、Alt Shift七、Ctrl Shift Alt八、其它 前言 工欲善其事必先利其器,JetBrains公司IDE工具为我们的开发…

用友U8+CRM 任意文件上传+读取漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 getemaildata.php 文件存在任意文件上传和任意文件读取漏洞,攻击…