一文彻底搞懂JVM垃圾回收算法

文章目录

  • 1. 标记-清除算法(Mark and Sweep)
  • 2. 复制算法(Copying)
  • 3. 标记-整理算法(Mark and Compact)
  • 4. 分代算法(Generational)
    • 4.1 执行流程

1. 标记-清除算法(Mark and Sweep)

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。

  • 标记阶段:从根对象出发,通过可达性分析算法标记所有可达对象。
  • 清除阶段:遍历整个堆内存,对未被标记的对象进行回收。

在这里插入图片描述

优点:解决了解决了引用计数算法中的循环引用的问题,没有从root节点引用的对象都会被回收,能够处理不连续的内存碎片。
缺点:1. 效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应用程序,对于交互性要求比较高的应用而言这个体验是非常差的。2. 通过标记清除算法清理出来的内存,碎片化较为严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的。

2. 复制算法(Copying)

复制算法的核心是将堆内存分为两个区域:一个存放活动对象(From Space),一个用于回收和分配新对象(To Space),每次只用其中的一个。当From Space内存占用达到一定比例时,将存活的对象复制到To Space中,并清空From Space。完成垃圾的回收。

如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。

在这里插入图片描述

优点:在垃圾对象多的情况下,效率较高,清理后没有内存碎片,分配内存简单高效。
缺点:需要额外的空间来存放活动对象,且无法处理大对象和长期存活对象,内存使用率较低。

3. 标记-整理算法(Mark and Compact)

标记整理算法是在标记清除算法的基础之上,做了优化改进。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的直接清理可回收对象,而是将存活对象都向内存另一端移动,然后清理边界以外的垃圾,从而解决了碎片化的问题。
在这里插入图片描述

优点:解决了标记-清除算法产生的内存碎片问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有有一定的影响。
缺点:移动对象需要更多的开销,可能会导致停顿时间较长。
与复制算法对比:复制算法标记完就复制,但标记整理算法得等把所有存活对象都标记完毕,再进行整理。

4. 分代算法(Generational)

将堆内存划分为不同的代(Generation),一般分为新生代(Young Generation)、老年代(Old Generation)和永久代/元空间(Permanent Generation/Metaspace)。在java8时,堆被分为了两份:新生代和老年代【1:2】,在java7时,还存在一个永久代。
在这里插入图片描述

大部分对象首先分配到新生代,只有经过多次回收仍然存活的对象才会晋升到老年代。对于新生代,内部又被分为了三个区域。Eden区,frm区,to区【8:1:1】

  • 当对新生代产生GC:MinorGC【young GC】
  • 当对老年代代产生GC:Major GC
  • 当对新生代和老年代产生FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长,应尽力避免,针对不同代使用不同的回收算法,如新生代常使用复制算法,而老年代则使用标记-清除或标记-整理算法。

优点:根据对象的生命周期,针对性地选择回收算法,提高了垃圾收集的效率。
缺点:需要维护不同代之间的引用关系和内存分配比例,增加了管理成本。

4.1 执行流程

  • 新创建的对象,都会先分配到Eden区

在这里插入图片描述

  • 当Eden内存不足,标记Eden与 from(现阶段没有)的存活对象将存活对象采用复制算法复制到 to 中,复制完毕后,Eden和 from 内存都得到释放

在这里插入图片描述

  • 经过一段时间后Eden的内存又出现不足,标记to区存活的对象,将存活的对象复制到from区

在这里插入图片描述

  • 当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)

在这里插入图片描述在这里插入图片描述

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

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

相关文章

《雾锁王国》超简单0成本自建个人专属16人联机服务器教程

阿里云雾锁王国服务器搭建教程是基于计算巢服务,3分钟即可成功创建Enshrouded游戏服务器,阿里云8核32G雾锁王国专用游戏服务器90元1个月、271元3个月,阿里云服务器网aliyunfuwuqi.com亲自整理雾锁王国服务器详细搭建教程: 一、前…

「实战应用」如何使用图表控件LightningChart创建数据采集系统?(一)

LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…

了解电力测试中负载箱的重要性?

电力测试是电力系统运行和维护的重要环节,其中负载箱作为一种重要的测试设备,其重要性不言而喻。负载箱主要用于模拟实际的电力负载,对电力设备进行性能测试和故障诊断,以确保电力系统的稳定运行。 负载箱可以模拟实际的电力负载。…

电商网站的大规模网页抓取 (终极指南)

电商网站的大规模网页抓取|电商数据采集API接口 与小型项目相比,大规模的网页抓取带来了一系列截然不同的挑战,例如基础结构搭建、管理资源成本、绕过爬虫检测措施等。 本文将指导您完成大规模数据收集,并以电商领域为重点。 Oxylabs 网页…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代,安卓与iOS系统犹如两位王者,各自拥有庞大的用户群体。有人钟情于安卓的开放与多样,有人偏爱iOS的流畅与稳定。甚至,有些人为了满足不同需求,同时使用着两个系统的手机。我就是其中的一员。 工作中…

PDF控件Spire.PDF for .NET【安全】演示:获取 PDF 签名中的所有证书

Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库,开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理,且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处…

golang实现延迟队列(delay queue)

golang实现延迟队列 1 延迟队列:邮件提醒、订单自动取消 延迟队列:处理需要在未来某个特定时间执行的任务。这些任务被添加到队列中,并且指定了一个执行时间,只有达到指定的时间点时才能从队列中取出并执行。 应用场景&#xff1…

Linux的Ubuntu的APT使用

Linux的Ubuntu的APT使用 apt 介绍 apt 是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,我们可以使用 apt 命令进行软件包的安装、删除、清理等,类似于 Windows 中的软件管理工具。 Ubuntu 软件操作的相关命令 su…

042-WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作

042-WEB攻防-PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作 #知识点: 1、PHP-MYSQL-SQL注入-常规查询 2、PHP-MYSQL-SQL注入-跨库查询 3、PHP-MYSQL-SQL注入-文件读写 演示案例: ➢PHP-MYSQL-Web组成架构 ➢PHP-MYSQL-SQL…

python自动化接口测试

前几天,同组姐妹说想要对接口那些异常值进行测试,能否有自动化测试的方法。仔细想了一下,工具还挺多,大概分析了一下: 1、soapui:可以对接口参数进行异常值参数化,可以加断言,一般我们会加http…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志,redo日志的功能就是把增删改操作都记录着,如果断电导致内存中的脏页丢失,可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性,undo日志设计出来是为…

从故宫修建看「软件物料清单」的重要性 @安全历史01

故宫,这座中国传统文化的重要代表和象征性建筑已屹立近600年,是世界上现存规模最大、保存最为完整的木质结构古建筑之一。 故宫之所以能至今保存完好,除持续保护和修缮外,其使用的木材和砖石等材料也经过了精挑细选,保…

一周学会Django5 Python Web开发-Django5路由重定向

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频,包括:2024版 Django5 Python we…

图片速览 PrintListener: 通过手指摩擦声发现指纹认证漏洞

原有一些方法主要是用字典猜测的方式来解锁的,文章的方法利用了用户滑手机屏幕产生的声音来辅助指纹的生成,且本文所提方案的准确性要更高(文章采样了各种环境、各种情况的数据,详见原文)。 PrintListener的攻击场景广泛且隐蔽。它只需要记录…

小米标准模组+MCU 快速上手开发(一)——之固件下载

小米标准模组+MCU 开发笔记之固件下载 背景技术名词简介● 小米IoT开发者平台● 小米IoT 模组● ESP系列简介问题描述 + 解决方式问题1:固件下载是否有示例,如何下载到硬件板卡中?问题2:固件下载的官方程序是什么?在哪里?该如何使用?问题3:固件下载时,Flash和Ram 有什…

安全这么卷了吗?北京,渗透,4k,不包吃住,非实习

起初某HR找人发了条招聘信息 看到被卷到4k一个月被震惊到了 随后发布了朋友圈,引起来众多讨论 对此网友发表众多评价 越来越卷的工作现象确实是一个普遍存在的问题 另外,也可以考虑和雇主沟通, 寻求更合理的工作安排, 或者…

C#,大规模图(Large Graph)的均匀成本搜索之迪杰斯特拉(Dijkstra)算法与源代码

1 均匀成本搜索 均匀成本搜索是迪杰斯特拉算法的变体。这里,我们不是将所有顶点插入到一个优先级队列中,而是只插入源,然后在需要时一个接一个地插入。在每一步中,我们检查项目是否已经在优先级队列中(使用访问数组)。如果是&…

flink反压

flink反压(backpressure),简单来说就是当接收方的接收速率低于发送方的发送速率,这时如果不做处理就会导致接收方的数据积压越来越多直到内存溢出,所以此时需要一个机制来根据接收方的状态反过来限制发送方的发送速率&…

精英ECS Z97-MACHINE V1.0 BIOS MX25L6406E

官网上的两个BIOS我都无法亮机,这是我保存出来的BIOS,不知道是否能使用五代的处理器 官网:Z97-MACHINE|Motherboard|产品|ECS 精英电脑 国外老哥的看法:ECS Z97-MACHINE Closer Look: The BIO…

手拉手助成长社会融合实践活动之新春送温暖

2月21日上午来自合肥市第四十五中学橡树湾校区七(15)中队、共青团合肥市第六中学2023级36班委员会的40多名同学,带来了龙年的礼物看望陪伴合肥市庐阳区为民社会工作服务中心幸福小院的兄弟姐妹。 大家详细地了解了幸福小院孩子们学习、康复和社会实践及能力提升情况…