垃圾回收的核心知识点解析

news2025/1/13 13:56:04

目录

  • 检测垃圾
    • 引用计数算法
    • 可达性分析算法
  • 回收垃圾
    • 标记清除算法
    • 复制算法
    • 标记整理算法
    • 分代算法

Java运行时内存中的程序计数器、虚拟机栈、本地方法栈这三部分区域其生命周期与相关线程有关,随线程而生,随线程而灭。而程序计数器就是一个单纯存地址的整数也不需要关心,因此我们GC(垃圾回收)的主要目标就是堆(堆中存放着几乎所有实例对象)!

检测垃圾

一个对象,如果后续不再被使用且没有引用指向它,就可以认为是垃圾。
有以下方法可知对象是否有引用指向:

引用计数算法

在主流的JVM中没有选用引用计数法来管理内存,最主要的原因就是引用计数法无法解决对象的循环引用问题 Python,PHP采取了引用计数算法。

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即可被回收。

        Test test1 = new Test();
        Test test2 = test1;
        Test test3 = test1;
        Test test4 = test1;

在这里插入图片描述

此算法存在两个缺陷:

  1. 浪费内存空间
  2. 存在循环引用的情况
    用一个例子来解释一下循环引用的问题:
class Test {
 public Test test;
}
        Test test1 = new Test();
        Test test2 = new Test();
        test1.test=test2;
        test2.test=test1;

在这里插入图片描述
此时test1与test2 销毁了,两个对象的引用计数分别减一。
在这里插入图片描述
此时这两个对象的引用计数不为0,不能作为垃圾且无法使用,陷入了一个逻辑上的循环。

可达性分析算法

通过一系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象到GC Roots没有任何的引用链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可用的

在这里插入图片描述
在java中,可作为GC Roots(垃圾回收根对象)的对象有以下几种:

  1. 栈上的局部变量
  2. 常量池中引用的对象
  3. 方法区中类静态属性引用的对象

只有从GC Roots对象开始,通过引用链可达的对象才被认为是存活的,而无法通过引用链访问的对象则会被判定为垃圾,并进行回收。

缺点:

  1. 遍历开销:可达性分析算法需要遍历整个对象图以确定每个对象的可达性。对于大型堆和复杂的引用关系,遍历开销可能非常大,特别是在全局垃圾回收中。这可能会导致垃圾回收的性能下降。
  2. 延迟回收:可达性分析算法需要遍历整个对象图,从GC Roots开始,逐个检查每个对象的引用关系。这个过程可能需要消耗大量的时间,且在垃圾回收期间,应用程序的执行会被暂停(STW - Stop-The-World)。因此,可达性分析算法可能导致较高的延迟,影响程序的响应性能。

回收垃圾

标记清除算法

算法分为"标记"和"清除"两个阶段 : 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
回收前:
在这里插入图片描述
回收后:
在这里插入图片描述
在这里插入图片描述
不足:

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

复制算法

"复制"算法是为了解决"标记-清理"的效率问题。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
简单来说复制算法就是把不是垃圾的对象拷贝到未使用的那一边,然后再统一释放刚才使用过的那一块区域

缺点:

  1. 内存利用率比较低。
  2. 如果当前区域的大部分对象都需要保留垃圾很少,那么此时的复制成本就比较高。

标记整理算法

标记整理算法的基本流程:

  1. 标记:从根对象开始,通过可达性分析算法,标记所有从根对象可达的存活对象。标记过程中,通常使用标记位(标记状态)来标记对象是否为存活对象。

  2. 整理:将所有存活对象移到堆的一端,紧凑排列,以便释放出连续的一段内存空间。在移动存活对象时,需要更新对这些对象的引用,确保引用指向移动后的新位置。

  3. 更新引用:在堆中,遍历所有存活对象的引用,将其指向新的位置。这是为了避免悬挂指针(引用指向被移动或已回收的对象)的问题。

  4. 释放未标记的对象:在整理后的堆中,所有没有被标记的对象都可以被认为是垃圾对象,可以直接被回收。

优点:解决了内存碎片问题。
缺点:搬运复制开销比较大。

分代算法

分代算法主要基于一种观察:大部分对象的生命周期都比较短暂。根据这个观察,分代算法将堆内存划分为不同的代(Generation),每一代中对象的生命周期不同,并且根据对象的生命周期将不同的垃圾回收策略应用于不同的代中。

一般来说,分代堆内存被划分为年轻代(Young Generation)和老年代(Old Generation)两个主要部分
年轻代
年轻代是存放新创建的对象的地方,大部分对象在创建后很快就变为垃圾对象。年轻代通常进一步分为Eden区和两个Survivor区。新创建的对象首先放入Eden区,当Eden区满时,不会被回收的对象会被转移到一个Survivor区。当一个Survivor区满时,其中的存活对象会被复制到另一个Survivor区或者老年代。经过多次垃圾回收后依然存活的对象将晋升到老年代。
年轻代通常采用复制算法(Copying)作为垃圾回收策略,因为新创建的对象的生命周期短暂,复制算法可以更好地利用对象的特点。
老年代
老年代是存放存活时间较长的对象的地方,老年代的对象生命周期较长,垃圾回收频率相对较低。对于老年代的垃圾回收,可以采用标记-清除(Mark-Sweep)或者标记-整理(Mark-Compact)等算法。

分代算法通过区分不同代的对象,针对不同代采取不同的垃圾回收策略,可以提高垃圾回收效率和系统性能。年轻代的频繁垃圾回收可以快速回收新创建对象,老年代的较少回收可以减少全局垃圾回收的引发,提高应用程序的响应性。这种分代垃圾回收策略在大多数的垃圾收集器中都有应用。

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

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

相关文章

Oracle Apex制作一个简单的交互式报表页面

简单查询一下: select ID,NAME,DESCRIPTION,PRICE from "FOOD_MENU" a 查询结果 创建交互式报表 工作报表展示 菜单报表展示 页设计器 改变布局样式 记得保存!!! 修改标签内容 添加验证&更改必填项 啥也…

BI-SQL丨XML

XML SQL Server中,存在一种特殊类型的数据,就是XML数据类型。 可能看到这里,小伙伴都会产生疑惑,XML不是Web语言么?为什么在SQL Server里面也会有XML数据类型? 这个就要从SQL Server的应用开始说起了&am…

自动驾驶MCU 软件架构说明

目录 1 文档... 2 1.1.1 变更历史... 2 1.1.2 Term.. 2 1.1.3 引用文档... 2 2 MCU软件框架图... 3 3 模块介绍... 3 文档 变更历史 版本Version 状态 Status 内容 Contents 日期 Date 撰写 Editor 批准 Approver V0.1 …

智慧工厂:如何打造工厂安全生产AI视频监管与风险预警系统?

一、背景需求 现代工厂多是机械操作,少量人员看守,甚至是无人化管理模式。企业都会在生产车间、仓库等重点区域安置摄像头留存画面用作回溯依据。但问题出现后再溯源,或许已经造成严重的生命安全事故和财产损失了。因此,对工厂各…

数据库技术与应用——目录篇

数据库技术与应用目录 文章目录 第1章 数据库基础知识数据库技术的概念数据管理的发展数据库的体系结构数据库管理系统常用的数据库管理系统介绍 第2章 信息得三种世界与数据模型信息的三种世界及其描述数据模型 第3章 关系模型关系模型的由来关系数据库的结构关系代数关系演算…

【算法练习】双指针

目录 移动零复写零快乐数盛最多水的容器有效三角形的个数和为s的两个数三数之和四数之和 移动零 算法原理: 数组划分(数组分块) 两个指针作用: cur:从左到右扫描数组,遍历数组 dest:已处理的区间内,非零元素…

比Wi-Fi快100倍!Li-Fi无线传输标准802.11bb正式发布:带宽高达224GB/s

大家对Wi-Fi可以说耳熟能详,最新标准已经演进到802.11be,即Wi-Fi 7,理论速率可达30Gbps。 现在,更强的来了。 IEEE今日正式签署802.11bb无线传输标准,即Li-Fi,基于光波的无线传输。 Li-Fi支持者认为&#x…

Appium+python自动化(五)- 模拟器(超详解)

简介 Appium是做安卓自动化的一个比较流行的工具,对于想要学习该工具但是又局限于或许当前有些小伙伴没 android 手机来说,可以通过安卓模拟器来解决该问题,下面就讲解使用appium连接安卓模拟器的操作步骤。而宏哥是由于手机数据线问题&#…

【大数据Hive】Hive 内部表与外部表使用详解

目录 一、hive 内部表简介 1.1 查看内部表信息 二、hive 外部表简介 三、内部表与外部表对比 四、内部表与外部表操作演示 4.1 内部表操作 4.1.1 数据准备 4.1.2 建表sql 4.2 外部表操作 4.2.1 建表sql 4.2.2 上传数据文件到 /stu目录 4.2.3 内部表删除 4.2.4 外部…

【一蹴而就】软著申请时,如何更高效地将源码进行格式处理和合并呢?这篇博客告诉你答案。

【一蹴而就】软著申请时,如何更高效地将源码进行格式处理和合并呢?这篇博客告诉你答案。 1,软著申请三要素2,源代码合成软件SourceConvert2.1 启动文件2.2 Spring项目源代码格式2.2.1 规律的包名2.2.2 核心文件 3,Sour…

[QT编程系列-10]:C++图形用户界面编程,QT框架快速入门培训 - 4- QT画图与动画

目录 4. QT画图与动画 4.1 QT的绘图系统 4.2 案例目标 4.3 绘制过程 4.4 更换控件的icon 4.5 案例2 4.6 坐标轴 4. QT画图与动画 4.1 QT的绘图系统 QT(也称为Qt Framework)是一种流行的跨平台应用程序开发框架,它提供了丰富的图形用户…

网页无插件播放265/264视频/监控大屏/GPU解码

网页无插件播放265/264视频/监控大屏/GPU解码 先看效果 特点 GPU解码,chrome网页播放32路 h256/hevc 直播视频流,毫无压力。提供1分屏、4分屏、8分屏、9分屏、16分屏、32分屏、64分屏分屏切换不会停止播放GPU解码、无插件播放自动识别264/265,并且都是…

飞控学习笔记-梯度下降算法(gradient descent algorithm)

简介 笔记来源于文章:An_efficient_orientation_filter_for_inertial_and_inertial_magnetic_sensor_arrays 共轭: 四元数叉乘: 欧拉角等式:

vue-springboot美食商城网站的设计与实现0fh04

美食网站是在的数据存储主要通过MySQL。用户在使用应用时产生的数据通过Java语言传递给数据库。通过此方式促进美食信息流动和数据传输效率,提供一个内容丰富、功能多样、易于操作的平台。述了数据库的设计,系统的详细设计部分主要论述了几个主要模块的详…

一文阐明死锁的成因及解决方案

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 目录 一、死锁的几种情况 1、一个线程,一把锁(上面同一线程给同一对象加两…

stm32PID调参实验

使用了增量式PID,有点难调,数据一直在波动。实际中调参具有很大的不确定性,因为你这次调好了,下次再供电发现又不是那么回事。按照网上传统的调参方法,一般是先调P,I和D为0,逐渐增大P使得实际值快速到达目标…

【API生命周期看护】API监控与运维

一、基本概念 当接口完成发布、上线后,就进入了正常的运行与维护状态。此时,对于API本身的监控与运维则变得尤为重要,这是保障服务功能可用、SLA达成的重要手段。 监控与运维本身是一个非常大的概念,从DevOps这一词汇中也能看出…

Linux下做性能分析6:理解一些基础的CPU执行模型

[介绍] 前面介绍了两个典型的调度模型,如果调度没有问题,剩下的问题就是正面刚算法了。那个不是我这里要介绍的主题的。 但,Not Really。其实除了算法在消耗CPU,CPU还是有很多余力可以挖掘的,这一篇我们专门讨论一下…

MySQL “error: ‘fd’: 未知重写说明符”

文章目录 1、【问题】MySQL “error: ‘fd’: 未知重写说明符”2、【解决】增加引用头文件 1、【问题】MySQL “error: ‘fd’: 未知重写说明符” 有以下代码,mysql 的 include 和 lib 都已经加入附加目录,libmysql.lib 已经加入依赖库: #p…

IEEE ICME 2023论文|基于交互式注意力的语音情感识别联合网络

论文题目: A Joint Network Based on Interactive Attention for Speech Emotion Recognition 作者列表: 胡英,侯世静,杨华敏,黄浩,何亮 研究背景 语音情感识别(Speech Emotion Recognitio…