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.mfbz.cn/a/37772.html

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

相关文章

LiveGBS流媒体平台GB/T28181功能-作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备

LiveGBS作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备 1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置 3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接…

Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件4. 接口层1.整体架构图 MyBatis 分…

程序员的自我修养(2)

目标文件的学习 1.什么是目标文件以及格式 目标文件为编译器编译后生成的文件,就是window下的.obj,linux下的.o文件。与可执行文件格式几乎一样,因为只是缺少链接过程。所以可执行文件,动态链接库,静态链接库&#xf…

【从零到Offer】反射那些事

什么是反射? ​ 反射简单来说,就是在代码运行期间,通过动态指定任意一个类,从而构建对象,并了解该类的成员变量和方法,甚至可以调用任意一个对象的属性和方法。以String对象为例子,传统构造方式…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式,简单的使用postman构造http请求,进一步了解https, 学习https的加密过程,了解对称密钥与非对称密钥对于加密是如何进行的,如有错误,请在评论区指正,让我们一起交流…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【3】静态编译 invalid run

上篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】_hkNaruto的博客-CSDN博客 修改gcc41.cfg,全部添加上-static 测试指令 runspec -c gcc41.cfg -T all -n 3 -r 1 -I -i ref all 结果:正常运行并生成报告 invalid run Invalid SPEC CFP2006…

自学网络安全(成为黑客)

一、前言 黑客这个名字一直是伴随着互联网发展而来,给大家的第一印象就是很酷,而且技术精湛,在网络世界里无所不能。目前几乎所有的公司企业甚至国家相关部门都会争相高薪聘请技术精湛的黑客作为互联网机构的安全卫士,所以黑客也…

rapid_latex_ocr: 更快更好用的公式图像转latex工具

Rapid Latex OCR rapid_latex_ocr是一个将公式图像转为latex格式的工具。仓库中的推理代码来自修改自LaTeX-OCR,模型已经全部转为ONNX格式,并对推理代码做了精简,推理速度更快,更容易部署。仓库只有基于ONNXRuntime或者OpenVINO推…

【Linux】基础开发工具——make

文章目录 前言:一、认识make和makefile二、依赖关系和依赖方法三、make工作原理 前言: 上一期分享了在Linux下编译源代码的两个工具,gcc和g。每次编译源代码,都要输入一串很长的指令,这个过程显然是十分复杂&#xff…

【Go|第8期】Lorca读取HTML的三种方式

日期:2023年7月16日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

天天刷题-->LeetCode(最长回文子串)

个人名片: 🐅作者简介:一名大二在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

JVM内存结构——前言

前提 1. 认识JVM,什么是JVM 简单来说,就是java程序的运行环境(java二进制字节码的运行环境) 1.1 JVM (java虚拟机)的好处 : 一次编写,到处运行的机制 (因为java语言是跨…

残差网络(ResNet) -深度学习(Residual Networks (ResNet) – Deep Learning)

在第一个基于cnn的架构(AlexNet)赢得ImageNet 2012比赛之后,每个随后的获胜架构都在深度神经网络中使用更多的层来降低错误率。这适用于较少的层数,但当我们增加层数时,深度学习中会出现一个常见的问题,称为消失/爆炸梯度。这会导…

可靠的手机问题修复工具分享 - 修复各种 Android 系统问题

一般来说,安卓手机都可以流畅运行。但不幸的是,有时您的Android手机可能无法正常运行,例如无响应、突然重启等。在这种情况下,您将需要Android手机维修软件。这些 Android 修复工具可以帮助您轻松解决此类问题,并还给您…

5.3 Python高级特性之-列表生成式、生成器、迭代器

一、 列表生成式 是Python内置的非常简单却强大的可以用来创建list的生成式 具体可根据如下案例理解,且代码也是可用的""" 1、 生成[0,1,2,3,4,5,6]这样列表 """ print(list(range(0, 7))) """ 2、 生成[0&#xff0…

【数据结构】树与二叉树(上)

目录 前言: 一、树: 1.树的概念: 2.树的相关概念: 3.树的表示: 4.书的实际使用场景: 二、二叉树: 1.二叉树的概念: 2.两种特殊二叉树: ①.满二叉树:…

在Vue种使用Vant框架

第一步:打开Vant框架地址 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/home 第二步: 安装 第三步:引入(我这里使用的是按需导入) 执行命令: npm i babel-plugin-import -D ①:src下创建个…

Oracle解析JSON字符串

Oracle解析JSON字符串 假设某个字段存储的JSON字符串,我们不想查出来后通过一些常见的编程语言处理(JSON.parse()或者是JSONObject.parseObject()等),想直接在数据库上处理,又该如何书写呢? 其实在ORACLE中…

小程序api的promise化

小程序根目录cmd运行安装命令 npm install --save miniprogram-api-promise1.0.4 安装完成之后先到根目录中删除miniprogram_npm文件夹(不删除构建npm时可能会出现问题) 删除之后再在工具中点击构建npm 构建成功之后会看到根目录中重新出现了miniprogram_npm文件夹 在app.j…

RNN LSTM

参考资料: 《机器学习2022》李宏毅史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎 (zhihu.com) LSTM如何来避免梯度弥散和梯度爆炸? - 知乎 (zhihu.com) 1 RNN 的结构 首先考虑这样一个 slot filling 问题: 注意…