JVM的垃圾收集算法

news2024/11/18 23:25:34

1.算法的分类

1.1标记清除算法

第一步:标记(找出内存中需要回收的对象,并且把它们标记出来)

根据可达性算法,标记的是存活的对象,然后将其他的空间进行回收

第二步:清除(清除掉被标记需要回收的对象,释放出对应的内存空间)

1.1.2缺点:

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

(1)标记和清除两个过程都比较耗时,效率不高

(2)会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

1.1.3算法过程:

1.1.4标记清除算法的衍生规则之分配(动态分区分配策略)

首次适应算法(Fisrt-fit)

就是在遍历空闲链表的时候,一旦发现有大小等于需要的大小之后,就立即把该块分配给对象,并立即返回。

缺点:

首次GC后,找到了一个大小合适的空闲空间,直接将该对象放入,导致后面的没有遍历,后面的碎片化和空闲极大

最佳适应算法(Best-fit)

就是在遍历空闲链表的时候,返回刚好等于需要大小的块

缺点:

需要遍历全表

最差适应算法(Worst-fit)

就是在遍历空闲链表的时候,找出空闲链表中最大的分块,将其分割给申请的对象,其目的就是使得分割后分块的最大化,以便下次好分配,不过这种分配算法很容易产生很多很小的分块,这些分块也不能被使用 

缺点:

找到最大的直接放入,如果找到的空闲块有5个,但是申请的对象只有4个空间块,那就会空出来一个,导致内存碎片化严重,如果找到的空闲块有5个,但是申请的对象却有6个空间块,那就会报内存溢出

1.2标记复制算法

1.2.1标记复制算法过程

将内存划分为两块相等的区域,每次只使用其中一块。 当其中一块内存使用完了,就将还存活的对象复制到另外一块上面,然后把已经使用过的内存空间一次清除掉。

1.2.2缺点 

内存的利用只有一半

1.3标记整理(压缩)算法

标记整理算法严格意义应该叫做标记清除整理算法或者标记清除压缩算法

因为他的本质就是在标记清除的基础在进行再整理

 

 1.3.1标记整理(压缩)算法衍生算法

 1.3.1.1随机整理

对象的移动方式和它们初始的对象排列及引用关系无关

原本的内存布局3-4是连续的

整理后由于1已经没有了4补上来导致内存不连续

任意顺序整理实现简单,且执行速度快,但任意顺序可能会将原本相邻的对象打乱到不同的高速缓存行或者是虚拟内存页中(理解为打乱到内存各个地方),会降低赋值器的局部性。 包括他只能处理固定大小的对象,一旦对象大小不固定,就会增加其他的逻辑。 

1.3.1.2线性整理

将具有关联关系的对象排列在一起

相关的对象会进行整理,整理成一块块小区域,无法避免内存碎片

将7、9有关联得对象放在一起,只会整理一个块有关联得对象,不会将所有有用的对象整理到一起,导致内存碎片很多

 1.3.1.3滑动整理

将对象“滑动”到堆的一端,从而“挤出”垃圾,可以保持对象在堆中原有的顺序

1.3.2几种典型的整理算法

1.3.2.1双指针回收算法:

实现简单且速度快,但会打乱对象的原有布局,属于随机整理

整理流程:

第一次遍历:移动位置但是并不更新标记

头指针找空闲的单元(可达的对象时非空的单元),尾指针向前找可达的,直到找到头指针的找到的空闲单元,也就是两个指针走到同一个单元上

 第二次遍历:更新标记

 一个指针向前移动,找大于下标4的对象,并更新GCroot的引用关系

缺点:

这种算法遇到内存大小不一的情况,就无法将尾端的对象直接拿到前面(假设后面的对象是前面对象大小的2倍,前面只空出来一个格子,这时就放不进去了) 

解决这个问题:

头指针记算一下当前空闲对象的空间,在往后走,直到找到可以放下后面要移动的对象

1.3.2.2Lisp2算法(滑动整理算法):

需要在对象头用一个额外的槽来保存迁移完的地址

整理前:他是一个三指针算法,并且可以处理不同大小的对象。但是需要三次遍历,并且由于对象大小不一样,所以需要额外的空间存储,而不是直接移动

第一次遍历:Free指针是为了留位置,而Scan对象是为了找存活对象

free的位置:free在第一个可达对象后进行移动

Scan找可达的对象,找到后进行标记,并记下使用的空间,并将这个值给到free指针,free在进行移动

如,Scan在0的位置记录空间是1,走到3的位置记录下空间是2,走到6的位置时记录下空间是1,那么Free指针的位置就是4,。也就是3的位置

 第二次遍历:更新对象地址

end指针只是为了标记尾端,让Scan指针直到走到尾了

第三次遍历:移动对象

 为什么要先修改对象地址,在移动对象

假设先移动对象,将6直接移动到3的位置这时就会发生对象覆盖的情况,由于指针信息是存在对象中的,备覆盖了这个对象就无法再更改引用关系了

1.3.2.3引线整理算法:(基本不用)

可以在不引入额外空间开销的情况下实现滑动整理,但需要2次遍历堆, 且遍历成本较高

1.3.2.4单次遍历算法:

滑动回收,实时计算出对象的转发地址而不需要额外的开销

单次遍历算法的重点在于提前记录我们需要转移的位置 关键词:偏移向量,标记向量以及内存索引号

开辟一块额外的空间并将内存划分成一块一块的,用于记录偏移向量(要移动的对象从哪到哪),标记向量(移动到什么位置)以及内存索引号(现在的位置)

第一次遍历将这些信息记录下来,第二次遍历进行位置移动

1.3.3总结:

所有现代的标记-整理回收器均使用滑动整理,它不会改变对象的相对顺序,也就不会影响赋值器的空间局部性。复制式回收器甚至可以通过改变对象布局的方式,将对象与其父节点或者兄弟节点排列的更近以提高赋值器的空间局部性

1.3.3.4限制:

整理算法的限制,如任意顺序算法只能处理单一大小的对象,或者针对大小不同的对象需要分批处理;整理过程需要2次或者3次遍历堆空间;对象头部可能需要一个额外的槽来保存迁移的信息。

2.分代收集理论 

当前主流商业 JVM 的垃圾收集器,大多数都遵循了 分代收集(Generational Collection)的理论进行设计,这里需要解释下,很多博客都会把分代收集当成一种具体的垃圾收集算法,其实并不是,分代收集只是一种理论,一套指导方针,一套符合大多数程序运行实际情况的经验法则,它建立在几个分代假说之上

2.1分代回收三大假说:

2.1.1弱分代假说:

绝大多数对象朝生夕死

这个对应Eden区,通过一次局部GC就可以回收绝大部分对象

2.1.2强分代假说:

活得越久的对象,也就是熬过很多次垃圾回收的对象是越来越难以消亡的

这个对于old区当对象年龄大于15时,就将其放入空间更大的老年区

2.1.3跨代引用假说

老年代引用了青年代里面的对象,或者青年代中的对象引用了老年代中的对象。

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

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

相关文章

企业域名邮箱申请流程指南:轻松搭建高效的企业邮箱系统

对于企业和个人来说拥有自己的域名和邮箱是展示形象和开展业务的重要工具,很多初学者可能对企业域名邮箱申请流程感到迷惑。企业域名邮箱申请流程分两步申请域名和创建邮箱,本文将详细介绍这两个步骤,帮助大家更好地理解和操作。 一、申请域名…

2024年最新FLStudio21破解版注册机百度网盘免费下载安装激活教程

高考完啦,你也迎来了人生中最长的暑假,现在你总不能以没时间为借口了,是时候学点属于自己的才艺了。还有3个月,你就会迎来开学迎新晚会这个校园中最受瞩目的活动。在这个特殊的时刻,如果你想以独特的方式展现自己&…

亚马逊出口电热毯日本PSE认证需要什么资料解析

电热毯出口日本需要办理PSE认证,电热毯,又名电褥,是一种接触式电暖器具。 PSE认证介绍是日本强制性认证,包含安全及EMI,用以证明电子电气等产品符合日期电气用品安全法或国际IEC标准的要求。日本电气用品安全法规定&am…

关于“研发效能冷思考”的冷思考 | IDCF

作者:冬哥 来源:DevOps 关于研发效能的冷思考 Robin(茹炳晟老师)在1.7号“冬哥有话说”的最后,提出关于研发效能的三个冷思考,核心问题是:研发效能的提升,是否真的让我们的工作和生活…

Chrome和chromedriver版本不匹配导致的UI自动化测试无法运行的问题

今天,遇到一个小问题,本来跑的好好UI自动化测试脚本突然不好使了,期初怀疑是页面元素有调整导致脚本出现异常无法正常执行,经排查后发现近期页面没有任何调整。 这下头大了,啥也没改,怎么好好的脚本不能跑…

环保回收信息展示预约小程序的效果如何

人们每天在线上的时间非常多,他们会通过线上寻找信息,而环保回收企业也在通过线上寻找客户,但受限于平台限制,无论引流获客还是营销互动、或是数据分析及全面管理方面都面对难题,其中微信/百度/快手/抖音/支付宝/快手等…

线性表但是是Java中数组实用使用

线性表定义: 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表,(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

Redis(位图Bitmap和位域Bitfield)

位图: 位图是字符串类型的扩展。 Redis中的位图是一种特殊的数据结构,用于表示一系列位的集合。它可以存储大量的布尔值数据,每个位代表一个布尔值(0或1),并且可以对这些位进行各种位运算操作。位图通常用…

Python二级 每周练习题27

如果你感觉有收获,欢迎给我微信扫打赏码 ———— 以激励我输出更多优质内容 练习一: 用户输入一个半径r,求该半径下的圆的面积s与周长c。要求如下: (1)输出的面积与周长都保留俩位小数; (2&a…

时尚女童千金小套装,爱了爱了

自带氛围感的小套装简直不要太好看 红色吸睛又喜庆,显白不挑人穿 谁穿都好看系列!! 厚实的苏两毛羊毛 保暖性能真的非常好 超柔软的手感和触感 显得很高级穿上也很舒适 一整个小公主style,时尚气质感拉满 里面的连衣裙单穿也很nice …

【CLion】CLion的cmake-build-release/debug位置变更

[CLion] CLion的cmake-build-debug和cmake-build-release位置变更 CLion IDE的cmake-build-release/debug位置是根目录下,虽然可以ignore这个文件,但是还是有点看起来不爽,按照这个方式就可以,干掉他,更改方式如下。 …

2.并发中-线程安全问题及三大特性

目录 概述线程线程安全问题线程安全的根本原因验证代码执行结果 解决线程安全代码结果 线程并发三大特性指令重排as-if-serial可见性cpu和缓存一致性java内存模型(java memory model)解决可见性问题及happens-before 结束 概述 线程 线程安全问题 多个线程同时执行&#xff…

中石油勘探院张弢:从业务到架构全面探讨中国石油的数字化转型之路

引言:OSDU论坛的诞生与壮大,对油气行业的数字化有极大的推动力,国内油气行业正在紧锣密鼓地开展数字化转型、智能化发展。当前油气上游业务数字化转型正在轰轰烈烈的开展,一些明星油田的数字化率无限接近100%,基于业务…

BGP笔记实验

IGP(Interior Gateway Protocol)——内部网关协议 OSPF RIP IS-IS IGRP EIGRP EGP(External Gateway Protocol)——外部网关协议 EGP BGP——边界网关协议 AS——自治系统 由单一组织or机构独立维护的网络设备&网络资源的集合 网络范围太大 自治 AS号 为了区分不同…

基于V100下Llama2-Atom大模型微调

文章目录 大规模的中文数据预训练模型部署模型微调Step1: 环境准备Step2: 数据准备Step3: 微调脚本Step4: 加载微调模型 一些BUG 大规模的中文数据预训练 原子大模型Atom在Llama2的基础上,采用大规模的中文数据进行持续预训练,包含百科、书籍、博客、新…

算法(圆的定义和相关术语)

无向图的度 图中每一个顶点的度定义为以该项点为一个端点的边的数目 #include <cstdio>const int MAXN 100;int degree[MAXN] { 0 };int main() {int n, m, u, v;scanf("%d%d", &n, &m);//在输出边度的时候就已经表示度的数目了&#xff0c;所以用一…

什么是高防CDN?有什么优势?

德迅高防CDN技术概述 随着互联网的快速发展&#xff0c;网络安全问题越来越受到人们的关注。高防CDN(Content Delivery Network)作为一种有效的网络安全防御手段&#xff0c;在企业和个人网站中得到了广泛应用。本文将详细介绍高防CDN的技术原理、防御原理、优点和应用场景&am…

探伤仪的曲线

超声波检验DAC曲线、AVG曲线的区别、使用及制作方法 一、 概念 1.1 DAC曲线 DAC距离波幅曲线是描述某一确定反射体回波高度随距离变化的关系曲线。因此&#xff0c;AVG曲线和DAC曲线都有纵波、横波制作的曲线&#xff0c;并不是简单地由纵波、横波来划分何为AVG曲线&#xf…

怎么实现在微信公众号秒杀商品的功能呢

实现微信公众号秒杀商品的功能&#xff0c;需要结合微信公众平台和后端开发技术。下面将介绍整个实现过程&#xff0c;包括前期准备、开发流程和后期运营等方面。 一、前期准备 确定秒杀商品&#xff1a;选择适合秒杀的商品&#xff0c;要求数量充足、质量良好&#xff0c;同时…

Python下使用requests库遇到的问题及解决方案

每一盏灯都有一个故事……当凌晨2点我的房间灯还亮着时&#xff0c;那就是我与BUG的一场生死博弈。一个人静静地坐在电脑前不断地写代码&#xff0c;感觉快要麻木了&#xff0c;好比闭关修炼一样枯燥无味。最终当我打通任督二脉后&#xff0c;bug修复迎来的一片曙光。 一、问题…