JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

1.标记-清除算法

最基础的算法,分为两个阶段,“标记”和“清除”

原理:
- 标记阶段:collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中,将其记录为可达对象。
- 清除阶段,collector对堆内存(heap memory)从头到尾进行线性的遍历,如果发现某个对象没有标记为可达对象-通过读取对象的header信息,则就将其回收。

 

可回收对象内存被收回,内存释放出来。 

 不足:
 - 标记和清除效率低
 - 回收之后有大量的不连续的空间碎片,这就会导致之后程序需分配大块连续的内存时,无法找到在足够的连续内存而不得不提前进行另一次的垃圾回收动作。

2.复制算法


为了解决效率问题,出现了复制算法

原理:
它可以将内存按照容量划分为大小相同的两块,每次只使用一块,当这块内存用完后,会将还存活的对象都放到另一块等大的内存中,最后再把已使用过的内存空间清理掉。这样每次都只会对半个内存回收,分配时不需要考虑内存空间碎片等问题。
 

 


缺点:
- 牺牲了一半的内存,成本太高。 
- 当对象的存活率高时,就需要进行繁多的复制,效率就会下降。
 

tip:
然而,现在得商业虚拟机都采用这种算法来处理新生代 ,因为新生代“朝生夕死”,所以不需要按照1:1的比例来分配,而是将内存分为一块较大的Eden和两块Survivor区域,每次使用Eden和其中一块的Survivor区域。
当进行垃圾回收时,会将Eden和使用过的Survivor中存活的对象复制到另一块没使用过的Survivor区域中。
HotSpot默认Eden和Survivor比例为8:1,这样相对1:1浪费一半的内存来说,我们只浪费了10%的内存。我们不能保证每次内存回收过后存活对象都不超过10%,因此,当Survivor区域内存不够时,就需要依赖老年代来进行分配担保 (Handle Promotion )


3.标记-整理法


标记和整理

算法:
- 标记:与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。
- 整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。

 

优点:
标记/整理算法不仅可以弥补标记/清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价。

缺点:
效率不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法。

效率:复制算法>标记/整理算法>标记/清除算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此)。

内存整齐度:复制算法=标记/整理算法>标记/清除算法。

内存利用率:标记/整理算法=标记/清除算法>复制算法。


4.分代收集


按照对象存活周期的不同, 将内存划分为几块。一般是把Java堆分为新生代和年老带,根据各个年代采用最合适的算法。譬如在新生代每次垃圾回收只有少量的存活,就使用复制法,在年老代中,对象都活的久,没有额外的内存担保空间,就必须采用“标记清除”出或者“标记整理”。

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

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

相关文章

自动化测试框架性能测试报告模板

目录 一、项目概述 二、测试环境说明 三、测试方案 四、测试结果 五、结果分析 总结: 一、项目概述 1.1 编写目的 本次测试报告,为自动化测试框架性能测试总结报告。目的在于总结我们课程所压测的目标系统的性能点、优化历史和可优化方向。 1.2 …

AUTOSAR CP标准的RTE和BSW各模块的设计及开发工作

AUTOSAR(Automotive Open System Architecture)是一种开放的汽车电子系统架构标准,旨在提供一种统一的软件架构,以实现汽车电子系统的模块化和可重用性。 AUTOSAR标准中的两个重要模块是RTE(Runtime Environment&…

【AI底层逻辑】——篇章5(上):机器学习算法之回归分类

目录 引入 一、何为机器学习 1、定规则和学规则 2、算法的定义 二、机器学习算法 1、常见学习方法 2、回归 3、分类 续下篇... 往期精彩: 引入 计算机发明初,专家通过将专业知识和经验梳理成规则输入计算机程序,但是这样跟不上知识…

【运维工程师学习五】数据库之MariaDB

【运维工程师学习五】数据库 1、常用的关系型数据库2、C/S结构3、MariaDB图形客户端4、安装MariaDB5、启动MariaDB及验证启动是否成功6、验证启动——端口7、验证启动——进程8、MariaDB配置文件路径主配置文件解读: 9、MariaDB的配置选项10、MariaDB客户端连接1、在…

设计模式 ~ 单例模式

单例模式 单例模式是一种设计模式,指在确保一个类只有一个实例,并提供一个全局访问点来访问该实例; 前端对于单例模式不常用,但是单例的思想无处不在; 创建之后缓存以便继续使用; 如:弹窗、遮罩…

【Python】json 格式转换 ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )

文章目录 一、json 格式转换1、json 模块使用2、代码示例分析 - 列表转 json3、代码示例分析 - 字典转 json json 格式 字符串 与 Python 中的 字典 dict 和 列表 list 变量 可以无缝转换 ; 调用 json.dumps 函数 可以将 Python 列表 / 字典 转为 json ;调用 json.loads 函数 …

Elasticsearch 中的矢量搜索:设计背后的基本原理

作者:Adrien Grand 你是否有兴趣了解 Elasticsearch 用于矢量搜索(vector search)的特性以及设计是什么样子? 一如既往,设计决策有利有弊。 本博客旨在详细介绍我们如何选择在 Elasticsearch 中构建矢量搜索。 矢量搜索…

python和django中安装mysqlclient失败的解决方案

在Pychram中和pip中安装mysqlclient都不成功,只能直接下载二进制包进行安装了,下载页面中根据python的版本选择对应WHL包下载,下载地址 mysqlclient PyPIhttps://pypi.org/project/mysqlclient/#files 通过pip命令进行安装 pip install d:\…

考研线性代数考点总结

一.行列式 1.数字型行列式 数字行列式的计算含零子式的分块计算 2.行列式的性质 |A||A^T|交换行列,行列式的值变号含公因子的提出或乘进去把某行的K倍加到另一行,行列式的值不变。行列式可以根据某一行或某一列分拆 3.抽象行列式 n阶或高阶行列式 常…

《微服务架构设计模式》第十三章 微服务架构的重构策略

微服务架构的重构策略 一、重构到微服务需要考虑的问题1、为什么重构2、重构形式3、重构策略 二、设计服务与单体的协作方式三、总结 一、重构到微服务需要考虑的问题 1、为什么重构 单体地狱造成的业务问题: 交付缓慢充满故障的软件交付可扩展性差 2、重构形式 …

Visual Studio 向工程中添加现有文件夹

前言: 在创建C#类库(dll)工程后,需要把现有的C#文件添加进工程中 步骤1.将所有文件夹复制到工程中 步骤2. 点击这个图标,显示所有文件夹 工程目录下的所有文件夹都会被显示出来 选中需要添加的文件夹,右…

Linux安装MongoDB数据库,并内网穿透远程连接

文章目录 前言1. 配置Mongodb源2. 安装MongoDB3. 局域网连接测试4. 安装cpolar内网穿透5. 配置公网访问地址6. 公网远程连接7. 固定连接公网地址8. 使用固定地址连接 前言 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富&…

虚拟化容器化与docker

虚拟化容器化与docker 基本概念虚拟化分类虚拟化实现主机虚拟化实现容器虚拟化实现命名空间namespace空间隔离 控制组群cgroup资源隔离 LXC(Linux Container) docker与虚拟机 基本概念 物理机: 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理…

初识Redis——Redis概述、安装、基本操作

目录 一、NoSQL介绍 1.1什么是NoSQL 1.2为什么会出现NoSQL技术 1.3NoSQL的类别 1.4传统的ACID是什么 1.5 CAP 1.5.1 经典CAP图 1.5.4 什么是BASE 二、Redis概述 2.1 什么是Redis 2.2 Redis能干什么 2.3 Redis的特点 2.4 Redis与memcached对比 2.5 Redis的安装 2.6 Docker安装 三…

二、学习回归 - 基于广告费预测点击量

山外风雨三尺剑 有事提剑下山去 云中花鸟一屋书 无忧翻书圣贤来 1.设置问题 以Web广告和点击量的关系为例来学习回归。 前提:投入的广告费越多,广告的点击量就越高。 根据以往的经验数据,可以得到下图: 那么假设我要投200块的广…

SeLa:Self Labeling Via Simultaneous Clustering and Representation Learning

方法论 有监督的分类任务实现 给定一个将数据I映射至特征向量 x ∈ R D x ∈ R^D x∈RD 的深度神经网络 Φ Φ Φ ,即 x Φ ( I ) x Φ ( I ) xΦ(I)。使用有N个样本 I 1 , … , I N I_1 , … , I_N I1​,…,IN​, 且具有标签 y 1 , … , y N ∈ { 1 , … , K }…

Office如何通过VSTO进行WORD插件开发?

文章目录 0.引言1.工具准备2.WORD外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

华为ospf路由协议在局域网中的高级应用案例

关键配置: 1、出口为ospf区域0,下联汇聚依次区域1、2…,非骨干全部为完全nssa区域 2、核心(abr)上对非骨干区域进行路由汇总,用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

在Microsoft Excel中如何快速将上下两行数据合并为一行?

合并单元格是电子表格初学者最常用的选项之一。当一组单元格、行或列需要标题或标签时,合并单元格是一种常用的技术。 合并单元格时,仅保留区域左上角单元格中的值或公式,并将其显示在合并后的单元格中。将丢弃任何其他值或公式,那么如何在新的空白单元格中将两行数据合并…

基于FPGA的按键消抖

文章目录 基于FPGA的按键消抖一、按键消抖原理二、按键消抖代码三、仿真代码编写四:总结 基于FPGA的按键消抖 一、按键消抖原理 按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性…