谈谈JVM的垃圾回收机制

news2024/12/25 10:53:47

目录

1. 死亡对象的判断算法

1.1 引用计数算法

1.2 可达性分析算法

 2. 垃圾回收算法

2.1 标记——清除算法

2.2 复制算法

2.3 标记——整理算法

2.4 分代算法


1. 死亡对象的判断算法

对于支持垃圾回收机制的编程语言来说,常见的死亡对象的判断方法有引用计数算法可达性分析算法两种,JVM的垃圾回收判断算法就是基于可达性分析来实现的。为了能够更好的理解垃圾回收机制,我们先对这两种死亡对象的判断算法进行分析。

1.1 引用计数算法

      引用计数算法就是指给引用对象额外新增一小片存储空间,用来保存引用这个对象的引用变量的个数,任何时刻当计数器变为0时,就可视为对象已死,我们的垃圾回收器就可以对其进行回收释放其占用的内存空间。

      这种引用计数来判断对象是否可回收的算法原理和实现都相对容易,判定效率也高,比如python语言就采用了这种垃圾回收判定算法。

      但是这种判定算法也会带来许多问题,其中最致命的两个问题有:空间利用率低和循环引用问题!所谓空间利用率低是指当我们的对应所占用的空间本就不大时,还需要额外开辟空间来保存引用的个数,这就造成了很严重的空间浪费问题。其二,当两个对象中的成员变量分别引用这两个对象,并且这两个对象的初始引用改变指向时,它们的引用计数器并不会归0,就像下面这段程序中的引用关系一样:

class Test {
    Test refer;
}

public class TestDrive {
    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test();
        test1.refer = test2;
        test2.refer = test1;
        test1 = null;
        test2 = null;
    }
}

这个时候垃圾回收器就无法对这部分空间进行回收,我们画张图来理解下引用计数判断算法带来的循环引用问题

 1.2 可达性分析算法

为了规避引用计数算法判断死亡对象的致命缺陷,于是有了可达性分析判断算法。这种算法的核心思想为通过一系列GCRoots的对象作为起始点,从这些起始点开始进行类深度有点遍历,对所有能够访问到的节点对象进行标记,这样进行下来,没有被标记的对象就被视为不可达或者说没有可供使用的引用指向,这些没有被标记的对象就被视为死亡对象,最终被垃圾回收器进行回收,释放其占用的内存空间。

 2. 垃圾回收算法

通过死亡对象判断算法我们已经能够找出待回收的冗余对象了,接下来我们来了解下长阿金的垃圾回收算法来更好的理解JVM的垃圾回收机制。常见的垃圾回收算法有以下几种:

2.1 标记——清除算法

标记清除算法是最基础的算法,分为标记和清除两个阶段,但标记清除算法有以下两个不足:

  • 标记和清除的效率都不高
  • 标记后的清除会产生大量不连续的内存碎片,导致以后在程序运行过程中需要分别较大空间的对象内存时,可能无法找到足够的连续内存。

2.2 复制算法

      复制算法是为了解决“标记-清理”算法的效率问题,它将内存区域划分为两块,每次只是用其中的一半。当其中一半需要进行垃圾回收时,会首先将该区域中还存活的对象拷贝到另一半内存区域,然后对这片内存区域进行全释放,一次性清理。这样做的好处就避免了产生大量内存碎片的问题,同时实现起来也相对简单,效率较高。

      但是当存活的对象比较多时,这种复制算法需要进行大量的复制操作,降低程序的运行效率。

 

2.3 标记——整理算法

该垃圾回收算法的标记过程与“标记-清除”算法相同,不过在“清除”阶段采用了将所有存活对象向一侧靠拢,然后将存活对象端外的内存进行集体释放,这个过程如下图所示:

 

2.4 分代算法

    上述的几种算法各有千秋,我们的当代的JVM为了重复优化垃圾回收机制的性能,对上述的集中垃圾回收算法进行整合形成了新的回收算法——分代算法。这种算法是被当代JVM虚拟机所采用的垃圾回收算法,下边我们依次来看下这种算法的实现原理和执行过程吧!😄

     所谓分代垃圾回收算法,其实就是按照对象的“年龄”进行进行分类(这里的年龄指的是没经过GC的依次扫描,年龄就长大一岁),并针对不同“年龄”的对象采用不同的回收措施以达到最优化回收的一种算法。

    分代回收算法将内存划分为“新生代”“老年代”两部分,其中,”新生代“区域又被分为“伊甸区”两个“幸存区”部分,如下图所示:

  1. 新创建出来的对象,就会被放在“伊甸区”
  2. 经过一轮GC扫描后,伊甸区中仍然存活的对象会被拷贝到“幸存区”当中(复制算法);
  3. 后续的几轮GC扫描,会将仍然存活的对象在两个”幸存者区“之间进行来回拷贝,每一轮都会回收掉一部分的死亡对象(复制算法)
  4. 在若干论扫描之后,仍然存活的对象会被放到老年代当中,经过前几轮的筛选,我们通常认为老年代中对象存活的可能性更大,存活的时间更长,因此,老年代这片内存区域被GC扫描的频率会低于新生代区域;
  5. 由于老年代中对象的存活概率大,使用复制算法就会导致开销太大,因此老年代内存区域中采用的的回收算法是标记——整理算法

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

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

相关文章

成功上岸北大!总分418分,数学150分,经验贴+方法论

Datawhale干货 作者:葛云阳,杭州电子科技大学,Datawhale成员 前 言 大家好,我是北海。2023年以总分418分的成绩上岸北京大学信息工程学院计算机应用技术专业,其中初试第三,复试第五,总成绩第三…

《编程思维与实践》1038.排版

《编程思维与实践》1038.排版 题目 思路 分两个步骤进行解决: 1.在给定长度下找到每一行可以容纳的最多单词数(单词长度<M/2保证每行至少有两个单词); 2.输出时补充额外的空格. 其中,第一个步骤可以通过分割字符串将每个字符串存起来,再找到第一个超过给定长度M的单…

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置 Tomcat的选择: 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致,避免一些不必要的问题。 配置步骤: 1、首先进入云服务器创建好放置tomcat的文件…

UE5实现Runtime环境下绘制线功能

文章目录 1.实现目标2.实现过程2.1 C++实现2.2 蓝图调用3.参考资料1.实现目标 UE5在Runtime环境下基于PDI绘制线,GIF动图如下: 2.实现过程 在UE5 Runtime环境下常用的绘制线方法有使用以下几种方式。一是基于SplineMeshComponent,即使用已有的点位去初始化样条线,然后在挂…

Ae:合成查看器 - 视图选项

合成查看器、素材查看器、图层查看器等面板底部的视图选项大同小异。 放大率弹出式菜单 Magnification ratio popup 用于显示和控制当前的放大率。 默认为适应当前面板大小。 更改放大率时,只是改变了面板中预览的外观,而不是合成的实际分辨率和像素。 适…

数据挖掘实验-week8-关联规则挖掘(Association Rule Mining)

Contents 0. 引言0.1 关联规则挖掘0.2 Apriori算法 实验Step 1:Familiarize yourself with the arules package in R.1.1 Load the package.1.2 To load data into R enter.1.3 To get information about the total number of transactions in a file sample1.csv e…

【requests模块上】——02爬虫基础——如桃花来

目录索引 requests请求:1. 基于get请求:*基础写法:**带参数的get请求:* 2. 基于post请求: 获取数据:1. 获取json数据:2. 获取二进制数据: 引入: requests是python的第…

不得不说的结构型模式-享元模式

目录 享元模式(Flyweight Pattern): 下面是一个简单的C代码案例 下面是面试中可能遇到的问题: 享元模式(Flyweight Pattern): 是一种结构型模式,它通过共享对象来减少系统中对象…

第四范式发布「式说」大模型,以生成式AI重构企业软件(AIGS)

4月26日,第四范式首次向公众展示其大模型产品「式说3.0」,并首次提出AIGS战略(AI-Generated Software):以生成式AI重构企业软件。式说将定位为基于多模态大模型的新型开发平台,提升企业软件的体验和开发效率…

湿法冶金铼提取工艺

湿法冶金 通过溶液分离金属的技术 湿法冶金是利用浸出剂在一定温度压力下与矿石接触,把矿石中有用的金属溶解后再从溶液中回收有价金属的一种工艺,因为其过程大都是在水溶液中进行,所以又被称为“水法冶金”。 01 湿法冶金工艺特点及工艺流…

AI智能课程:第五讲chatGPT搞定APP小程序

内容总结 作业 目录 APP&小程序测试初识 ### APP&小程序测试的区别? 设计APP&小程序功能测试用例 设计APP&小程序功能测试用例–继续优化 设计APP&小程序测试用例-中断场景 设计小程序测试用例–补充小程序功能专项 APP&小程序兼容性测试…

Raft 共识算法4-选举限制

Raft 共识算法4-选举限制 Raft算法中译版地址:https://object.redisant.com/doc/raft%E4%B8%AD%E8%AF%91%E7%89%88-2023%E5%B9%B44%E6%9C%8823%E6%97%A5.pdf 英原论文地址:https://raft.github.io/raft.pdf Etcd Assistant 是一款 etcd 可视化管理软件&a…

大数据Doris(四):FE部署及启动

文章目录 FE部署及启动 一、创建doris 部署目录 二、上传安装包并解压

Monaco Editor编辑器教程(二八):Monaco 与 VS Code 两个项目的联系与异同点

前言 很多人知道前端代码编辑Monaco Editor 与VS Code 有关系,但却不清楚其中的细节,本篇文章就带大家了解一下两者的关系和异同点。 表面对比 首先,这两个项目都是来自微软,其中VS Code 项目Github 144K star,是基于CS架构,客户端-服务端架构。主要的技术栈是 electo…

你不知道的自动装箱和拆箱

“改天是明天,下次是每一次,以后是以后的每一天” 自动装箱和拆箱 装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的valueOf(int) 方法 拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int);调用方法:I…

骨传导蓝牙耳机哪款好,分享几款性能比较高的骨传导耳机

骨传导耳机是一种新型的耳机,它将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。不需要通过耳道,是一种耳挂式的无线耳机。 骨传导耳机与普通耳机相比,最大的优势是不需要入耳&am…

VasDolly实现多渠道打包

目录 一、添加对VasDolly Plugin的依赖 二、 引用VasDolly Plugin 三、添加对VasDolly helper类库的依赖 四、根目录新建文件添加渠道列表 五、主App工程的build.gradle中配置channel 六、根据已有基础包重新生成多渠道包 官方地址: GitHub - Tencent/VasDol…

【21】linux进阶——grep命令搜索查找

大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…

【1048. 最长字符串链】

来源:力扣(LeetCode) 描述: 给出一个单词数组 words ,其中每个单词都由小写英文字母组成。 如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么…

【AI】Python 安装时启用长路径支持

文章目录 场景:解释:关于文件长路径:计算方法: 场景: Python 安装时,会出现 Disable path length limit 的提示。 解释: 在 Windows 操作系统中,文件路径的长度是有限制的。在早期…