JVM——分代收集理论和垃圾回收算法

news2024/11/23 22:29:18

一、分代收集理论

1、三个假说

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

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

        这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

        把分代收集理论具体放到现在的商用Java虚拟机中里,设计者一般至少会把Java堆划分成新生代老年代两个区域。

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

每次回收进行后,没有被回收的对象年龄加1,加到一定次数(一般是13),就会进入老年代。

        如果一个区域中大多数对象都是朝生夕灭,难以熬过垃圾收集过程的话,那么把它们集中放在一起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低代价回收到大量的空间;如果剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。
跨代引用问题
        跨代引用问题:新生代引用了老年代的对象,老年代不消亡,新生代就不消亡,但是每次回收还需要扫描,看老年代有没有被回收,需要遍历老年代所有对象,增加内存压力,让新生代年龄加1,当老年代消亡时,新生代也消亡了。
跨代引用假说:存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。
        依据这条假说,我们就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录 每一个对象是否存在及存在哪些跨代引用, 只需在新生代上建立一个全局的数据结构 (该结构被称为“记忆集”, Remembered Set ), 这个结构把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用 。此后当发生Minor GC 时,只有 包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描 。虽然这种方法需要在对象改变引用关系(如将自己或者某个属性赋值)时维护记录数据的正确性,会增加一些运行时的开销,但比起收集时扫描整个老年代来说仍然是划算的。

2、部分收集和整堆收集

部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集
  1. 新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。
  2. 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。
  3. 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。

整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。

二、垃圾回收算法

1、标记-清除算法

分为标记和清除两个阶段。后续大部分算法也是以它为基础。

标记所有需要回收的对象,然后统一回收。

反过来也可以。

标记所有存活的对象,回收没有标记的。

缺点:

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

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

2、标记-复制算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

优点:解决碎片化问题,实现简单,运行高效。

缺点:可用内存缩小为原来的一半。

3、标记-整理算法

针对老年代,其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

优点:1.移动完会使内存更加规整

          2.如果老年代多,基本上都不移动

缺点:1.如果不应用于老年代,需要移动的对象过多就会消耗大量资源

          2.移动时必须暂停所有程序

 

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

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

相关文章

R语言实现免疫浸润分析(1)

免疫浸润分析是生物信息学研究中的一项关键内容,它旨在评估肿瘤微环境中不同类型的免疫细胞组成。免疫细胞在肿瘤发展和治疗中起着至关重要的作用,因为它们可以影响肿瘤的生长、扩散和对治疗的响应。 为了了解免疫细胞在肿瘤中的分布和数量,…

【潮州饶平】联想 IBM x3850 x6 io主板故障 服务器维修

哈喽 最近比较忙也好久没有更新服务器维修案例了,这次分享一例潮州市饶平县某企业工厂一台IBM System x3850 x6服务器亮黄灯告警且无法正常开机的服务器故障问题。潮州饶平ibm服务器维修IO主板故障问题 故障如下图所示: 故障服务器型号:IBM 或…

客达天下项目案例

本资料转载于传智播客https://www.itheima.com/ https://space.bilibili.com/3493265607232348 黑马程序员主办的全日制统招大学——大同互联网职业技术学院 预计2024年开始招生,敬请持续关注! B站视频入口:002_接口项目介绍_哔哩哔哩_bili…

互联网发展历程:从布线到无线,AC/AP的崭新时代

互联网的发展,一直在追求更便捷、更灵活的连接方式。在网络的早期,布线问题常常让人头疼。一项革命性的技术应运而生,那就是“无线AC/AP”。 布线问题的烦恼:繁琐的布线 早期网络的布线工作常常耗费时间和精力,尤其在大…

随机森林:人类基因组中病毒片段识别

百万年前人类基因组中基因组中就已经嵌入了病毒序列,其中一部分在某些条件下会致病,通过基因测序获得海量片段之后就可以判断正常基因和病毒序列了。 我们根据这种包含众多碱基的基因测序结果从中选取部分特征,关于特征的选取也是有好有坏的…

剑指offer62.圆圈中最后剩下的数字

这道题在算法课上的一个小故事上有一个类似的,就是一个军官打了败仗,带着他的几个兵逃到一个山洞,他们不想当俘虏想自杀,但是军官不想自杀但是又不好意思走,于是军官想了个办法,他们几个人围成一个圈&#…

数据库的新工具datagrip

datagrip的安装(一路next即可) 首先,双击datagrip安装包,会出现下面的界面,然后直接点击next 继续点击next 选中tatagrip,然后在点击next 点击install 勾选datagrip,然后在点击finish 直接点击…

【面试题】JavaScript高级四、高阶技巧

JavaScript高级四、高阶技巧 1、深浅拷贝 首先浅拷贝和深拷贝只针对引用类型 (1)浅拷贝 浅拷贝:拷贝对象的属性的值(简单类型存的值就是值本身,引用类型存的值是对象的堆地址),所以如果拷贝的…

大模型PEFT技术原理(二):P-Tuning、P-Tuning v2

随着预训练模型的参数越来越大,尤其是175B参数大小的GPT3发布以来,让很多中小公司和个人研究员对于大模型的全量微调望而却步,近年来研究者们提出了各种各样的参数高效迁移学习方法(Parameter-efficient Transfer Learning&#x…

gitee上传一个本地项目到一个空仓库

gitee上传一个本地项目到一个空仓库 引入 比如,你现在本地下载了一个半成品的框架,现在想要把这个本地项目放到gitee的仓库上,这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址:https://gite…

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来,随着物流行业迅速发展,物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现,严重影响了物流作业效率,市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

Hlang社区项目说明

文章目录 前言Hlang社区技术前端后端 前言 Hello,欢迎来到本专栏,那么这也是第一次做这种类型的专栏,如有不做多多指教。那么在这里我要隆重介绍的就是这个Hlang这个项目。 首先,这里我要说明的是,我们的这个项目其实是分为两个…

【第三阶段】kotlin语言中的语法异常处理与自定义异常特点

fun main() {var name:String?nulltry{checkException(name)println(name!!.length)//不管name是不是null 后面都会执行}catch(e:Exception){println("你好$e")} }fun checkException(name:String?){name?:throw CustException()//?: 如果name为null 执行后面的抛…

【开发笔记】在Python中调用Docker,并运行SDK任务

目录 1 背景2 环境准备3 实现流程3.1 连接远程Docker3.1 创建容器3.2 解压SDK3.3 挂载容器卷3.4 运行任务3.5 判断任务状态3.6 容器的停止与销毁 4 可能遇到的问题 1 背景 使用Python,在远程Docker中创建一个容器,并在该容器中运行SDK任务 2 环境准备 …

day10 11-牛客67道剑指offer-JZ37 、54、41、59、12、13、14、82、9、22

文章目录 1. JZ37 序列化二叉树2. JZ54 二叉搜索树的第k个节点3. JZ41 数据流中的中位数数组堆 4. JZ59 滑动窗口的最大值5. JZ12 矩阵中的路径6. JZ13 机器人的运动范围7. JZ14 剪绳子乘方dp 8. JZ82 二叉树中和为某一值的路径(一)9. JZ9 用两个栈实现队列10. JZ22 链表中倒数…

redis-数据类型及样例

一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求:存储多个数据,并对数据…

2023,家用美容仪的“春天”来了吗?

【潮汐商业评论/原创】 编辑部的Jessica又买了一台水牙线,用她的话说:“能让自己更完美为什么不去试试呢?” 事实上,像这样的个护产品,Jessica不止一两个,从腰颈按摩仪到护肤导入仪、从全脸射频仪再到全身…

数的范围(二分模板)

大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 不清楚蓝桥杯考什么的点点下方👇 考点秘籍 想背纯享模版的伙伴们点点下方👇 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

lab2 system calls

目录 PreRead任务列表4.3 Code: Calling system calls4.4 Code: System call arguments System call tracing测试任务hints思路先看用户的trace函数trace系统调用到底是怎么作用的呢? 重新捋一遍系统调用的过程 Sysinfo任务hints思路 PreRead 任务列表 xv6课本 第二…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮,国内科技企业纷纷布局。据不完全统计,截至目前,国内大模型数量已达上百个。在这些大模型中,谁的表现最好,智能性最高,用户体验最强?8月12日,新华…