JVM面试题详解系列——垃圾收集算法详解

news2025/1/30 16:12:22

垃圾收集算法

标记 - 清除算法

首先标记出所有需要被回收的对象,标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。

这种方法主要有两个缺点:

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

在这里插入图片描述

标记 - 复制算法

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了。将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完之后,就将还存活着的对象复制到另外一块上面,然后再把已使用过的这一块的内存空间一次清理掉。

这样使得每次都是对内存区间的一半进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半,内存利用率低。

在这里插入图片描述

现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。

当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”。当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保(Handle Promotion)。

分配担保: 如果另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。

标记 - 整理算法

复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在对象存活率较高的老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法, 标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 标记-整理算法如图所示:

在这里插入图片描述

三种垃圾收集算法比较

在这里插入图片描述

分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。

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

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

相关文章

最短路径(难)

目录 一、Dijkstra算法 动态演示: 关键代码: 完整代码: 运行结果: 二、Floyd算法 详细介绍 关键算法: 完整代码: 运行结果: 一、Dijkstra算法 Dijkstra算法:可以求带权图中…

开发者还能这样开发小游戏变现

根据《2022微信小游戏增长白皮书》显示,目前微信小游戏开发者数量已经超过10万人次,特别是在持续出现小游戏爆火社交平台的趋势下,小游戏发展势头强劲。 此外仅看微信小游戏的商业规模,2022年相较于2021年实现了超 30%的商业增长…

快速了解Azure SQL部署类型的小技巧

目录 (一)前言 (二)正文 1. 语法 2. 结果分析 3. 实例 (1)SQL SERVER (2)Azure SQL (一)前言 我们知道在常规的SQL SERVER中我们会使用SELECT VERSIO…

我国汽车保险杠行业对汽车产业依存度较大 市场需求呈良性上升态势

根据观研报告网发布的《2022年中国汽车保险杠市场分析报告-市场发展格局与投资潜力研究》显示,汽车保险杠是汽车车身上一种较大的外覆盖零部件,其作用是在汽车发生碰撞时,保护汽车车身及附件,轻微碰撞可以依靠保险杠自身吸收能量&…

MySQL中的这14个神仙功能,惊艳到我了!!!

前言 我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。 1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中…

劲牌连续两年问鼎全国质量大奖背后的密码

11月24日,第二十届全国质量奖“中国杰出质量人”正式公布,劲牌公司董事长吴少勋成为全国10人名单之一。这是劲牌公司继2021年获得第十九届全国质量奖组织奖后,又获得全国质量奖个人奖。连续两年分别获得全国质量奖组织奖和个人奖,…

18岁开始学习编程是否来得及?

18岁开始学习编程完全来得及,不仅来得及,而且还可以选择走专业的程序研发路线,在当前产业互联网的推动下,未来程序开发岗位的数量还会进一步得到攀升。 18岁开始学习编程可以根据自身的实际情况来规划具体的学习路线,对…

java回顾:ssm整合、纯注解开发

目录 一、搭建环境 1.1、spring环境搭建 1.1.1 测试SpringIOC环境 1.2、搭建Mybatis环境(原生mybatis) 二、Spring整合mybatis 三、Spring整合SpringMVC 四、SSM执行流程 五、纯注解开发配置文件模板 声明: SpringMVC: 注解 XML 注解: Control…

[streamlit]数据科学科研工作者的神器,必须要推荐一下

1. 前言 做科研当然要有过硬的专业知识,但是也少不了一些辅助,才能最大程度发挥我们的能力。因此,除去我们模型性能优秀,结果良好以外,如何进行一个好的展示,也是非常有必要的。那么今天,我们就…

推荐系统:基于ConvNCF推荐算法的推荐系统实现 代码+数据详细教程

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。ConvNCF推…

西瓜书-决策树

决策树 决策树划分时,当前属性集为空,或所有样本在所有属性上取值相同,将结点标记为叶节点,其类别标记为当前样本集中样本数最多的类。 决策树算法的核心在于:选择最优划分属性 判别分类的三种情形: 当前…

[前端攻坚]:详解call、apply、bind的实现

call apply bind 的实现的面试中几乎必定出现的一些内容,今天来用一篇文章整理一下这里的内容,加深一下JS基础知识体系。同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。 call的实现 call() 方法使用一个指定的 this 值和单…

Oracle Ask Tom分区学习系列: 面向开发者的分区(Partitioning)教程

Oracle Partitioning: A Step-by-Step Introduction for Developers是Oracle数据库开发者课程之一。 Development with Oracle Partitioning/使用 Oracle 分区进行开发 Partitioning in the database reflects the same way we handle large tasks in the real world. When a t…

Redis分布式锁的10个坑

前言 大家好,我是田螺。 日常开发中,经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁,很容易踩坑哦~ 本文田螺哥将给大家分析阐述,Redis分布式…

如何优化 MySQL 服务器

有一些数据库服务器的优化技术,主要是管理系统配置而不是调整 SQL 语句。它适用于那些希望确保服务器的性能以及可伸缩性的 DBA,以及适用于启动安装脚本建立数据库和运行 MySQL 自己进行开发、测试等以提生产力的开发人员。 系统因素 一些系统级方面也会…

推荐几个方法教你学会怎样制作视频剪辑

随着时代的发展,新媒体行业的壮大,应该不少小伙伴每天都需要制作视频剪辑吧,有些可能是因为从事短视频行业,每天就需要发送视频内容,才能吸引观众,也有些可能只是想单纯分享一些生活视频。那你知道如何制作…

List接口-ArrayList、LinkedList和Vector

1.List 接口和常用方法 1.1List 接口基本介绍 import java.util.ArrayList; import java.util.List;public class List_ {SuppressWarnings({"all"})public static void main(String[] args) {//1. List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复 [案例]…

Linux网络编程之socket通信

Linux网络编程之socket通信 一、socket相关函数使用 1.1 IP地址转换函数: 小端法:(pc本地存储) 高位存高地址,低位存低地址。 大端法:(网络存储) 高位存低地址,低位存…

13基于多目标粒子群算法的微电网优化调度(matlab程序)

参考文献 基于多目标粒子群算法的微电网优化调度——王金全(2014电网与清洁能源) 主要内容 针对光伏电池、风机、微型燃气轮机、柴油发电机以及蓄电池组成的微电网系统的优化问题进行研究,在满足系统约束条件下,建立了包含运行…

day25【代码随想录】左叶子之和、找树左下角的值、从中序与后序遍历序列构造二叉树、从中序与前序遍历序列构造二叉树、最大二叉树

文章目录前言一、左叶子之和(力扣404)1、递归遍历2、非递归遍历二、找树左下角的值(力扣513)1、迭代法(层序遍历)2、递归法三、从中序与后序遍历序列构造二叉树(力扣106)四、从中序与…