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跨代引用假说

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

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

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

相关文章

气相色谱质谱仪样品传输装置中电动针阀和微泄漏阀的解决方案

标题 摘要:针对目前国内外各种质谱仪压差法进样装置无法准确控制进气流量,且无相应配套产品的问题,本文提出了相应的解决方案和配套部件。解决方案主要解决了制作更小流量毛细管和毛细管进气端真空压力精密控制问题,微流量毛细管的…

Qt TCP相关的一些整理:服务端常见操作 socket 通信 network

目录 前言: 1、相关的库和类 2、服务端常用API 核心代码呈上: 前言: 在Qt的服务端上,不单单会用到服务端本身的API,对连接上来的客户端,也需要进行数据交互,也要用到一些收发包相关的…

Linux(5):Linux 磁盘与文件管理系统

认识 Linux 文件系统 磁盘的物理组成: 1.圆形的磁盘盘(主要记录数据的部分); 2.机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据); 3.主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。 4…

runnergo全栈测试平台

一、全栈测试平台runnergo使用 官网 官方使用文档 二、单接口测试 三、性能测试 1.性能测试 2.性能测试报告 四、自动化测试(暂时不支持UI自动化,或许会上)

数据结构与算法编程题6

将两个有序顺序表合并成一个新的有序表&#xff0c;并有函数返回有序顺序表 #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;…

ck 配置 clickhouse-jdbc-bridge

背景 ck可以用过clickhouse-jdbc-bridge技术来直接访问各数据库 安装配置 需要准备的文件 clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge 理论上需要下载源码然后用mavne打包&#xff0c;但提供了打包好的&#xff0c;可以推测用的是mave…

leetcode:20. 有效的括号

一、题目&#xff1a; 链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;bool isValid(char* s) 二、思路&#xff1a; 利用栈来解这道题会方便许多&#xff1a; 遍历字符串s&#xff0c;当遇到左括号就将其压入栈中&#xff1b;遇…

Mac- Iterm 2 (替换mac terminal 终端的下一代终端工具)

1.应用场景 主要用于macOS中作为终端工具使用, 执行终端命令, Iterm 2 (替换mac terminal 终端的下一代终端工具) 2.学习/操作 1.文档阅读 chatgpt & 其他资料 2.整理输出 2.1 是什么 Iterm 2 (替换mac terminal 终端的下一代终端工具) 2.2 为什么需要「应用场景」 macOS…

二蛋赠书九期:《机器学习图解》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

关于标准库中的string类 - c++

目录 关于string类 string类的常用接口 string类常用接口的简单模拟实现 关于string类 string类在cplusplus.com的文档介绍 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 3. string在…

css 实现鼠标上移添加下划线

效果图 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

vue3+elementPlus登录向后端服务器发起数据请求Ajax

后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…

OpenHarmony 4.1计划明年Q1发布, 5.0预计Q3发布

据HarmonyOS官方组织透露&#xff0c;OpenHarmony 4.0 版本已于 10 月 26 日正式发布&#xff0c;开发套件同步升级到 API 10。开放原子开源基金会现更新了 OpenHarmony 4.1&5.0 版本路线图。据介绍&#xff0c;OpenHarmony 4.1 Beta 版本预计将于年底完成测试并发布&#…

智能座舱架构与芯片- (12) 软件篇 中

三、智能座舱操作系统 3.1 概述 车载智能计算平台自下而上可大致划分为硬件平台、系统软件&#xff08;硬件抽象层OS内核中间件&#xff09;、功能软件&#xff08;库组件中间件&#xff09;和应用算法软件等四个部分。狭义上的OS特指可直接搭载在硬件上的OS内核&#xff1b;…

智能座舱架构与芯片 - (1) 背景篇

一、软件定义汽车 1.1 什么是软件定义汽车 软件定义汽车(Software Defined Vehicles, SDV)的核心思想是&#xff0c;决定未来汽车的是人工智能为核心的软件技术&#xff0c;而不再是汽车的马力大小&#xff0c;是否真皮座椅&#xff0c;机械性能的好坏。软件定义汽车的终极目…

架构探索之路-第一站-clickhouse | 京东云技术团队

一、前言 架构, 软件开发中最熟悉不过的名词, 遍布在我们的日常开发工作中, 大到项目整体, 小到功能组件, 想要实现高性能、高扩展、高可用的目标都需要优秀架构理念辅助. 所以本人尝试编写架构系列文章, 去剖析市面上那些经典优秀的开源项目, 学习优秀的架构理念来积累架构设…

Python+OpenCV裂缝面积识别系统(部署教程&源码)

1.研究背景与意义 随着科技的不断发展&#xff0c;计算机视觉技术在各个领域中得到了广泛的应用。其中&#xff0c;图像处理是计算机视觉中的一个重要分支&#xff0c;它通过对图像进行数字化处理&#xff0c;提取出其中的有用信息&#xff0c;为后续的分析和应用提供支持。而…

基于SSM的校园活动资讯网设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

dolphinscheduler任务莫名重跑

dolphinscheduler运行了一段时间&#xff0c;忽然发现一个流程下某个任务一直在自动重跑&#xff0c;把工作流删了&#xff0c;任务删了&#xff0c;下线等等&#xff0c;都不能阻止他重复的运行&#xff0c;每秒1次&#xff0c;真是见了鬼 1、把zookeeper停掉发现不再重跑了 …

79基于matlab的大米粒中杂质识别

基于matlab的大米粒中杂质识别&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 79matlab图像处理杂质识别 (xiaohongshu.com)