垃圾收集算法面试总结
垃圾收集算法
标记 - 清除算法
首先标记出所有需要被回收的对象,标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。
这种方法主要有两个缺点:
- 一个是效率问题,标记和清除两个过程的效率都不高;
- 另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,内存碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
标记 - 复制算法
为了解决效率问题,一种称为“复制”(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堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。
相关文章:

垃圾收集算法面试总结
垃圾收集算法 标记 - 清除算法 首先标记出所有需要被回收的对象,标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 这种方法主要有两个缺点: 一个是效率问题,标记和清除两个过程的效率都…...

grep替换指定字符串方法
在 Linux 命令行中,可以使用 grep 命令来查找匹配某个模式的字符串,并将其替换为另一个字符串。具体方法如下: grep -rl <pattern> <directory> | xargs sed -i s/<old_string>/<new_string>/g其中,<…...

主从模式、哨兵模式、集群模式(cluster)
主从模式、哨兵模式、集群模式(cluster) redis 实现高可用的方式分为 主从模式、哨兵模式、集群模式(cluster) 1. 主从模式(又称为主从复制) 表现为1个主节点,多个从节点,主节点负…...

题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题
原题链接 https://www.dotcpp.com/oj/problem3162.html 想直接看题解的,跳转到第三次尝试即可。 已AC。 解析: (1)首先大家要知道什么叫互质: 以及它们的性质: 欧拉函数 在数论中,对正整…...

Java 文件操作
字符流-Writer和Reader用于读取文本-BufferedReader(new FileReader("path")) 读取文本文件-BufferedWriter(new FileWriter("path")) 写入到文本文件 字节流-InputStream和OutputStream图片、二进制文件-BufferedInputStream(new FileInputStream(new F…...

二叉树OJ题(C++实现)
文章目录 1.二叉树的层序遍历2. 二叉树的最近公共祖先3.二叉搜索树与双向链表4.从前序与中序遍历序列构造二叉树 1.二叉树的层序遍历 二叉树的层序遍历 OJ连接 主要思路是借助一个队列,将每一层的数据以size统计,当size为0时说明该层数据已经输入完&…...

grep -nr 命令查询字符串方式
grep -nr “搜索内容” 文件路径 其中: -n:显示行号-r:递归查找子目录中的文件“搜索内容”:要搜索的内容文件路径:要搜索的文件路径,可以是单个文件或目录路径(将会递归搜索该目录下的所有文…...

AgentAI+ChatGPT给出答案-为什么即时通讯需要心跳
序言 人工智能ChatGpt 结合系统化的问题拆解, 现在已经能够进行问题的拆解与自问自答, 预计未来很多的脑力工作要被释放了, 作为即时通讯的开发人员, 我问问专业的问题 为什么即时通讯需要心跳 先看产品界面与使用结果 问题拆解过程 执行任务1: 概念搜索 “Executing “Res…...

跨平台跨端的登录流程及其安全设计
跨平台跨端的登录流程及其安全设计 目录 跨平台跨端的登录流程及其安全设计 一、登录流程 1.1、登录流程时序图 1.2、三方App 登录 1.3、请求的路由守卫 二、注册流程 2.1、注册流程时序图 2.2、多因素认证 2.3、自动跳转登录页面 三、涉及的技术与安全 3.1、用户…...

如何在Java中创建临时文件?
在Java程序中,有时需要创建临时文件来暂存数据或者执行某些操作。Java提供了许多方式来创建临时文件。在本教程中,我们将介绍如何使用Java标准库来创建临时文件。 一、使用File.createTempFile()方法 Java标准库中的File类提供了createTempFile()方法来…...

Vue表单基本操作-收集表单数据
收集表单数据 使用vue中的v-model收集表单里面的数据,不同的表单元素配合v-model会有不同的写法和技巧 本次的表单元素包括:文本框,单选,多选,下拉框,文本域 编写表单元素 首先编写表单元素,…...

Android 一个获取网址时间的Demo
Android 一个获取网址时间的Demo 文章目录 Android 一个获取网址时间的Demo通过一个网址获取时间的代码关于Android NTP 时间Android 同步时间代码 前段时间有个客户想用局域网同步Android 设备的时间,开发后把这个demo分享一下。 效果: 这里也获取了阿…...

ijkplayer解码流程源码解读
ijkplayer是一款基于ffmpeg的在移动端比较流行的开源播放器。FFmpeg是一款用于多媒体处理、音视频编解码的自由软件工程,采用LGPL或GPL许可证。 要想理解ijkplayer源码,首先得知道视频播放器的基本原理。 视频播放器播放一个互联网上的视频文件…...

2023年值得关注的3个品牌趋势,帮你弯道超车
2023年,大环境开放,压抑三年的消费蓄势待发,品牌如何唤醒消费者的、热情成了重中之重的大事。 春风和煦,万物生长。又到了各类品牌、各位营销人踌躇满志、斗志昂扬的时候了,浅析一下2023品牌宣传趋势,抓住…...

软考-高级项目管理(二十)
第20章 高级项目管理 (P572考0-2分选择 性价比很低) 在项目集管理中涉及的相关角色主要包括: 项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人 1.项目集发起人 项目集发起人和收益人是负责承诺将组织的资源应用于项目集,并致力于使项目集取得…...

RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术
目录标题 1. 引言1.1 流媒体传输技术的重要性1.2 为什么选择RTMP协议1.3 RTMP协议的发展与应用 2. RTMP协议基础2.1 RTMP协议简介2.2 RTMP协议与其他流媒体协议的比较2.3 RTMP协议的组成与工作原理 3. RTMP协议详解3.1 RTMP数据单元(Message)3.2 RTMP数据…...

2023mathorcup数学建模ABCD思路分析
更多思路分析,请看文末 A题:量子计算机在信用评分卡组合优化中的应用 题目提到了信用评分卡的组合优化,这是一个经典的优化问题。在这个问题中,需要通过不同的组合方式来选择不同的阈值,以达到最大化贷款利息收入和最…...

普通家庭,千万不要投入大量时间和金钱,让孩子去苦学和培养AI机器人编程了...
普通家庭,千万不要投入大量时间和金钱,让孩子去苦学和培养一些看似高端,实际却用处不大的兴趣爱好课程了,比如学钢琴、学音乐、学AI机器人编程这些兴趣爱好课程。 这些对孩子的成长其实意义并不大,尤其是AI机器人编程。…...

C++学习(day2)
文章目录 四. C中的字符串4.1 C支持两种风格的字符串4.2 string类型的赋值和初始化4.3 C风格和C风格的字符串互换4.4 string类中三个重要成员函数4.5 string类型的比较4.6 string类型的成员访问 at()6.8 string类型数据的输入 五、bool类型六、引用(reference&#…...

软考 - IP地址与网络划分
一.IP组成 1.1 首个八位字节规则 1.2 地址掩码 IP地址掩码 标准地址掩码 A类:255.0.0.0 前1个字节是网络号 后3个字节是主机号 B类:255.255.0.0 前2个字节是网络号 后2个字节是主机号 C类;255.255.255.0 前3个字节是网络号 后1个字节是主机号…...

Apifox软件的基础使用方式
Apifox软件的基础使用方式 简单方便的用途 该工具是接口在线调试工具,这里我给到连接供大家去官网下载,我个人觉得是比较于postman工具好用,提供的语言操作是中文版本的便于操作 下载和安装 https://apifox.com/?utm_sourcebaidu&ut…...

【Tensorflow】模型如何加载HDF文件数据集?
如果每个样本都被保存为一个单独的 HDF5 文件,可以使用 tf.data.Dataset.list_files 函数来创建一个文件名数据集,然后使用 tf.data.Dataset.interleave 函数来并行读取多个文件。 下面的示例展示了如何从多个 HDF5 文件中读取数据并创建一个 tf.data.D…...

校招又临近了,怎么在面试中应对设计模式相关问题呢?
夏天开始了,那么夏天结束时的毕业季也不远了。毕业是个伤感、期待而又略带残酷的时节,就像蜜桃无论成熟与否都会在这个时间被采摘,如果毫无准备就踏入社会,就会……马上变成低级社畜。所以说还是要早点为了毕业找工作做点准备&…...

padans关于数据处理的杂谈
情况:业务数据基本字段会有如下: Index([时间, 地区, 产品, 字段, 数值], dtypeobject)这样就会引发一个经典“三角不可能定理”,如何同时简约展现分时序、分产品、分字段数据。)一般来说, 1、时序为作为单独的分类&…...

神经网络的理解
文章目录 概念得分函数损失函数神经网络结构非线性激活函数神经网络运行过程神经网络能够做的事情概念 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并…...

夏驰和徐策带你从零开始学数据结构——哈希表
哈希表的概念: 哈希表是一种常用的数据结构,它可以在 O(1) 的时间复杂度内执行插入、查找和删除操作。哈希表的核心思想是使用哈希函数将键值对映射到数组中的一个位置上,从而实现快速的访问和修改。 哈希表由两个主要部分组成:…...

linux实现网络程序
1️⃣ 在linux下,通过套接字实现服务器和客户端的通信。 2️⃣ 实现单线程、多线程通信。或者实现线程池来通信。 3️⃣ 优化通信,增加守护进程。 有情提醒,类里面默认的函数是内联。内联函数在调用的地方展开,没有函数地址&…...

FreeRTOS 队列(二)
文章目录 一、向队列发送消息1. 函数原型(1)函数 xQueueOverwrite()(2)函数 xQueueGenericSend()(3)函数 xQueueSendFromISR()、xQueueSendToBackFromISR()、xQueueSendToFrontFromISR()(4&…...

用python获取当前目录下的创建时间超过3天的所有python文件
直接上代码: import os import datetime print(os.getcwd()) # 获取当前目录下所有的html文件 html_files [] for filename in os.listdir(): if filename.endswith(.py): html_files.append(os.path.join(., filename)) now date…...

第五章 Linux实际操作——用户管理
第五章 Linux实际操作——用户管理 5.1 基本介绍5.2 添加用户5.3 指定、修改密码5.4 删除用户5.5 查询用户信息指令5.6 切换用户5.7 查看当前用户、登录用户5.8 用户组5.9 用户和组相关文件8.9.1/etc/passwd 文件8.9.2/etc/shadow文件8.9.3/etc/group文件 5.1 基本介绍 Linux系…...