JVM的垃圾收集算法

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.mzph.cn/news/158662.shtml

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

相关文章

Sentinel 监控数据持久化(mysql)

Sentinel 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制,即自行扩展实现 MetricsRepository 接口(修改 控制台源码)。 本文通过使用Mysql持久化监控数据。 1.构建存储表&#xff08…

ESP32 Arduino实战Web篇-使用 WebSocket 创建 ESP32 Web 服务器

本文将详细介绍如何使用 WebSocket 创建 ESP32 Web 服务器,解释WebSocket原理与搭建步骤,并附超详细的代码解释 假设我们需要创建一个使用 ESP32 通过 WiFi 控制灯泡的项目。实现非常简单:我们将 ESP32 设置为软 AP 或 STA 模式,使其能够提供一个网页,显示灯开关的状态为…

HT560 30W 过温限幅 D类音频功率放大器

HT560具有过温限幅功能,当芯片内部温度达到过温限幅点,HT560自动降低增益,使其IC能够连续播放而不间断。另外,HT560具有功率限制功能,一种是限幅功能,在输出端限制一定的输出幅度,使其不损坏喇叭…

阿里云高效计划学生和老师免费代金券申请认证方法

阿里云高校计划学生和教师均可参与,完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣,适用于云服务器等全量公共云产品,订单原价金额封顶5000元/年,阿里云百科aliyunbaike.com分享阿里云高校计划入口及学…

2014年3月13日 Go生态洞察:并发模式与管道取消技术

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

刷题学习记录(攻防世界)

wife_wife 一拿到题目就提示这题不用爆破 进入环境得到的是一个登录框 随便试了一下登录账户密码会提示错误,那就去注册账户,注册的账户还有注册管理员的选项 先注册普通用户234,注册好后登录 这样就得到flag,但是提交是错误的&a…

KT404A语音芯片U盘更新语音方案说明_通讯协议 硬件设计参考

一、功能简介 KT404A语音芯片用U盘更换语音文件,适用于广告机、提示器等等场景 为了满足客户不方便使用PC电脑端更新,我们在KT404A芯片的基础上,开发了U盘更换声音文件的功能,保持和之前的标准本本【也就是KT404A芯片的基础版本…

论文笔记:Localizing Cell Towers fromCrowdsourced Measurements (intro 部分)

2015 1 Intro 1.1 motivation opensignal.com 、cellmapper.net 和 opencellid.org 都是提供天线(antenna)位置的网站 他们提供的天线位置相当准确,但至少在大多数情况下不完全正确这个目标难以实现的原因是蜂窝网络供应商没有义务提供有…

[原创]解决老款AMD CPU在Win10/Win11无故重启的问题.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

python 实现银行卡号查询银行名称和简称

本章教程利用python实现查询银行卡号名称和简称 。 目录 一、 实例代码 二、运行效果 一、 实例代码 #!/usr/bin/python # -*- coding: UTF-8 -*- """ author: Roc-xb desc: python 实现银行卡号查询银行简称 """ import requestsdef bank_mes…

Vue2 基本语法

Vue2 基本语法 前言Vue2 基本语法脚手架文件结构关于不同版本的Vuevue.config.js配置文件ref属性props配置项mixin(混入)插件scoped样式总结TodoList案例webStorage组件的自定义事件全局事件总线(GlobalEventBus)消息订阅与发布(pubsub&#…

【OpenGauss 列存储学习总结 2】

OpenGauss 列存储学习总结 2 概述文章链接 概述 列存储是一种优化技术,用于在数据库系统中存储和查询大量数据。与传统的行存储方式不同,列存储将每个列的数据分别存储在独立的存储单元中,而不是按照行的方式存储。这种存储方式在分析性查询、…

FFmpeg 6.1 开放源码多媒体框架近日发布了重大更新

导读FFmpeg 6.1 开放源码多媒体框架近日发布了重大更新,带来了新功能、新解码器、新过滤器和许多其他变化。 在 FFmpeg 6.0 “Von Neumann “版本发布八个多月后,FFmpeg 6.1 被命名为 “Heaviside”,引入了多线程 Vulkan 硬件加速解码&#x…

时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测

时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测 目录 时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机时间序列预测 1.data为数据集…

2023年中国合成云母行业现状及市场格局分析[图]

合成云母是一种通过化工原料经高温熔融冷却析晶而制得的单斜晶系矿物,属于典型的层状硅酸盐,许多性能都优于天然云母,如合成云母的耐温高达1200℃以上,而天然白云母在550℃下就会开始分解,金云母则在800℃开始分解。除…

HC32L110小华半导体SWD模式切换的问题

在将SWD配置为普通引脚并配置为输出后,如果需要重新配置为SWD,需要将其配置为输入才行,如下: Clk_SetFunc(ClkFuncSwdPinIOEn, TRUE); //配置SWD引脚为普通引脚模式 Gpio_InitIOExt(SWCLK_PORT, SWCLK_PIN, GpioDirOut, TRUE,…

麻雀搜索优化算法MATLAB实现,SSA-BP网络

对于麻雀搜索算法的介绍,网上已经有不少资料了,这边公布SSA的matlab实现 下面展示SSA算法的核心代码以及详细注解 % 麻雀搜索算法函数定义 % 输入:种群大小(pop),最大迭代次数(Max_iter),搜索空间下界(lb)&#xff0c…

【C++进阶】二叉搜索树(BSTree)

​👻内容专栏:C/C编程 🐨本文概括:二叉搜索树的基本操作(查找、删除、插入)、二叉搜索树的应用,KV模型。 🐼本文作者:阿四啊 🐸发布时间:2023.11.22 一、二叉搜索树 1.1…

Maven中常用命令以及idea中使用maven指南

文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …

大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC]

文章目录 大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责…