​​JVM三:JVM垃圾回收机制(GC)

news2024/11/22 4:25:05

1.什么是垃圾?

指的是不再使用的内存。

2.垃圾回收

将不用的内存,自动释放,解决内存泄露问题。

3.GC主要针对堆进行释放

GC是以"对象"为基本单位,进行回收,而不是字节。

垃圾回收(GC)主要处理三种情况:

  1. 完全不使用的对象:当一个对象不再被任何其他对象或程序部分引用时,GC会将其识别为垃圾并回收。这意味着,只有在对象完全没有被引用时,才会成为垃圾回收的目标

  2. 部分引用的对象:如果一个对象仅部分属性或方法不再被使用,但整体上仍有引用存在,GC不会回收该对象。只有当对象作为一个整体不再需要时,才会考虑回收。

  3. 回收策略在执行垃圾回收时,GC会回收整个对象,而不会只回收对象的某一部分。即,垃圾回收器是基于对象整体来判定是否需要回收,而不是基于对象的部分属性或方法。

这种回收机制确保了内存的有效管理和程序的稳定性,避免因部分回收导致的程序错误或内存泄漏。


4.实际工作过程

1.判定垃圾方法

如何判断哪个对象是垃圾,哪个对象不是垃圾,关键思路:抓住这个对象,查看它到底有没有"引用"指向它?那应该如何具体知道对象是否有引用指向?

1.1死亡对象判定方法

1.1.1 引用计数

引用计数机制是一种垃圾回收策略,它通过给每个对象分配一个引用计数器来跟踪对象的引用情况。具体流程如下:

  1. 初始化引用计数器:当创建一个新的对象时,为其分配一个初始值为0的引用计数器。

  2. 增加引用计数:每当有一个引用指向该对象时,将该对象的引用计数器加1。这可以通过赋值操作、参数传递等方式实现。

  3. 减少引用计数:每当某个引用被销毁或不再指向该对象时,将该对象的引用计数器减1。

  4. 检查引用计数:当对象的引用计数器变为0时,意味着没有任何引用指向该对象,因此可以认为它是垃圾。此时,垃圾回收器会释放该对象所占用的内存空间。

引用计数机制的局限性可以从以下几个方面进行详细分析:

  1. 内存空间利用率低

    • 每个对象都需要一个额外的引用计数器来记录其被引用的次数。这个计数器会随着对象的创建而分配,无论对象的大小如何。
    • 假设每个引用计数器占用4个字节的存储空间,对于一个体积为1KB的对象,附加的空间消耗相当于增加了约4%的额外空间。而对于更小的对象,比如4字节的对象,引用计数器的体积与对象本身的体积相等,这意味着整体空间占用翻了一倍。
    • 这种空间的额外消耗在处理大量小型对象时尤为明显,可能导致显著的内存效率降低。
  2. 循环引用问题

    • 当两个或多个对象彼此之间相互引用,但没有其他活动路径可以访问这些对象时,就形成了所谓的循环引用。此时,即使这些对象不再被程序的其他部分使用,它们的引用计数也不会归零。
    • 例如,考虑两个对象(1号和2号)互相引用,但没有任何外部引用指向它们。如果销毁它们之间的相互引用,每个对象的引用计数将从1减到0。然而,由于它们彼此之间的存在引用,引用计数器不会归零。
    • 这种情况下,即使这两个对象实际上已经无法被程序访问,它们仍然不会被标记为垃圾,从而导致内存泄露。

1.1.2 可达性分析

       在Java中,对象之间通过引用相互联系,形成了复杂的链式或树形结构。

       以二叉树为例,一个对象的引用可能指向另一个对象,而这个对象的成员又可能指向其他对象,这样的关系构成了一个整体的网络。

      为了有效地管理内存,Java使用了可达性分析来标记和清除不再使用的对象

可达性分析的基本概念

  • 将所有Java对象视为通过引用连接成的树结构。
  • 从根节点(称为GC roots)开始遍历,标记所有可达的对象。
  • GC roots包括栈上的局部变量、常量池中的对象以及静态成员变量。
  • 不可达的对象,即从GC roots无法遍历到的对象,被视为垃圾,将被回收。

可达性分析的缺点

  1. 速度较慢:与引用计数相比,可达性分析需要遍历整个对象树,这通常是一个较慢的过程。
  2. 间歇性执行:尽管速度较慢,但可达性分析不需要持续执行。它通常会在特定的时间间隔内进行,以减少对系统性能的影响。

2.对象释放方法

2.1 标记-清除算法

       标记-清除(Mark-and-Sweep)算法分为“标记(Mark)”和清除(Sweep)”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。

如下图,灰色部分,为标记的对象。

但是这种算法,会产生明显的两个问题:

1.效率问题:标记和清除两个过程效率都不高;

2.内存碎片问题:标记清除后,被释放的空闲空间,是零散的,不是连续的,会有内存碎片问题。


2.2 复制算法

      复制(Copying)算法为了解决内存碎片问题而出现的,它将内存分成大小相同的两块,然后将"不是垃圾"的对象复制到另一半,然后再把使用的空间一次性清理掉。

 虽然复制算法解决了内存碎片问题,但是它也存在两个明显的问题:

1.空间效率:空间利用率低,可用内存缩小为原来的一半;

2.复制成本问题:如果要清除的垃圾比较少,有效对象比较多,复制成本比较大。


2.3 标记-整理算法

       标记-整理算法(Mark-and-Compact)是一种解决复制算法缺点的内存回收方法。它与"标记-清理"算法在标记过程上相同,但不同之处在于处理存活对象的方式。标记-清理算法会直接回收垃圾对象,而标记-整理算法则是将所有存活对象向一端移动,然后直接清理掉垃圾对象。这种方法类似于顺序表中删除中间元素时的元素搬运操作。

       虽然标记-整理算法解决了内存碎片问题,同时也保证了空间利用率问题,但是它也存在明显的问题:

 效率不高,如果要搬运的空间比较大,此时开销比较大


2.4 分代回收算法

上述算法各有优缺点,我们可以根据不同的场景应用不同的算法,从而得出了一个复合算法——分代回收算法。该算法将垃圾回收分为不同的场景,根据对象的生命周期长短来选择使用哪种算法。

Java的对象要么生命周期特别短,要么生命周期特别长。我们可以引入一个概念,即对象的年龄。年龄是指对象熬过垃圾回收(GC)的轮次。经过一次垃圾回收的扫描,如果发现这个对象还不是垃圾,就为它增加一轮年龄。

      对于年轻代的对象,我们可以使用复制算法或标记-整理算法进行垃圾回收;而对于老年代的对象,我们可以使用标记-清理算法或标记-整理算法进行垃圾回收。

      如上图,根据对象的年龄,我们将对象分成不同的代。新创建的对象,其年龄为0,被放置在伊甸区(Eden Space)。在年轻代中,我们使用复制算法来进行垃圾回收。当对象在垃圾回收过程中存活下来,即熬过一轮GC后,它会被移动到幸存区(Survivor Space)。

      在幸存区,对象会继续经历周期性的垃圾回收扫描。如果对象被识别为垃圾,则会被释放;如果不是垃圾,它会被拷贝到另一个幸存区。注意,两个幸存区不会同时使用,而是交替使用。由于幸存区的空间相对较小,这种来回拷贝导致的空间浪费是可以接受的。

      如果一个对象在两个幸存区之间多次来回拷贝,它的年龄会逐渐增加,最终会被移至老年代(Old Generation)。老年代中的对象通常具有较长的生命周期。对于老年代,我们也需要进行周期性的垃圾回收扫描,但相比年轻代,频率更低。在老年代,我们采用标记-整理算法来释放空间。

       通过这种分代回收的方式,我们可以更高效地管理内存,对不同生命周期的对象采用适当的垃圾回收策略,从而优化程序的性能和内存使用效率。

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

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

相关文章

刑事拘留和逮捕在程序上有何区别?

1. 实施条件:刑事拘留是在有重大犯罪嫌疑且存在逃避侦查、串供或者其他妨碍刑事诉讼行为可能的情况下,由公安机关决定采取的临时剥夺人身自由的强制措施。而逮捕则是更为严厉的强制措施,通常在犯罪嫌疑人涉嫌的重大犯罪事实已经查清&#xff…

【贝壳找房】测试开发一面凉经--北京现场面(附面试答案)

1.单链表反转写 单链表是一种线性结构,它是由一个个节点(Node)组成的。并且每个节点(Node)是由一块数据域(data)和一块指针域(next)组成。 节点的数据域:da…

vue element-plus el-drawer 自定义抽屉标题 template slot动态标题定义方法

默认抽屉定义&#xff0c; 这里的title就是标题的定义 <el-drawer v-model"drawer" title"I am the title" :direction"direction" :before-close"handleClose" > 如果我们需要自定义这个标题&#xff0c;就需要使用slot <e…

ebpf教程(4.1):XDP程序的加载

文章目录 前言环境准备加载XDP程序源码构建过程运行 前言 前置阅读要求&#xff1a; ebpf教程(3):使用cmake构建ebpf项目-CSDN博客[译] [论文] XDP (eXpress Data Path)&#xff1a;在操作系统内核中实现快速、可编程包处理&#xff08;ACM&#xff0c;2018&#xff09;xdp-t…

Zabbix 中网络设备(交换机和防火墙)的报警信息配置指南

简述 本文介绍配置 Zabbix 以监控网络设备&#xff08;如交换机和防火墙&#xff09;并发送钉钉报警信息&#xff0c;我将提供一个详细的步骤指南。 请确保你已经完成了以下前提条件&#xff1a; 1. Zabbix 已经搭建完成。2. 网络设备&#xff08;交换机和防火墙&#xff09…

空状态设计教程:连接用户体验的桥梁

空状态设计是产品设计中常被忽视却又极其重要的一环。它不仅是用户旅程的起点&#xff0c;更是塑造第一印象的关键。本文将引导你如何使用强大的设计工具设计出既美观又实用的空状态&#xff0c;以提升用户体验。 空状态设计的意义 空状态作为用户与产品初次邂逅的界面&#…

PostgreSQL-04-入门篇-连接多张表

文章目录 1. 连接设置样例表PostgreSQL 左连接PostgreSQL 右连接PostgreSQL 全外连接 2. 表别名简介表别名的实际应用1) 对长表名使用表别名&#xff0c;使查询更具可读性2) 在连接子句中使用表别名3) 在自连接中使用表别名 3. INNER JOIN 内连接简介PostgreSQL INNER JOIN 示例…

【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)

目录 &#x1f354;欠拟合与过拟合 1.1 欠拟合与过拟合定义 1.2 通过代码认识过拟合和欠拟合 1.3 原因以及解决办法 &#x1f354;正则化 2.1 什么是正则化 2.2 正则化类别 &#x1f354;小结 学习目标 &#x1f340; 掌握过拟合、欠拟合的概念 &#x1f340; 掌握过…

黄山黄小徽光影乐园:思特科技打造沉浸式光影乐园解决方案,快乐指数拉满了!

01      「黄小徽儿童光影乐园」是由思特科技全力打造&#xff0c;依托行业领先的数字光影技术与交互科技&#xff0c;专为3-8岁儿童设计的全场景、全交互、全沉浸的沉浸式光影乐园解决方案。    沉浸式光影乐园解决方案-黄小徽儿童光影乐园      02      思特…

无人机之固定翼无人机的组成

固定翼无人机是根据空气动力学原理设计机翼的形状&#xff0c;靠动力装置产生推力或者拉力&#xff0c;使无人机获得一定速度后&#xff0c;会导致空气在飞机上下表面的压力不同&#xff0c;进而产生升力&#xff0c;其升力主要来源于固定的机翼。大多数都是由机翼、机身、尾翼…

ultralytics实例分割mask读取

在前面学习YOLOv8的实例分割过程中&#xff0c;需要使用实例分割的数据集&#xff0c;其标签的标注格式如下&#xff1a; 实例分割勾勒轮廓 其中&#xff0c;第一个数字代表的是类别编号&#xff0c;后面的数据代表的是标注的坐标&#xff08;转换到0-1之间&#xff09;每两个…

编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度

文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码&#xff1a; SessionFactoryImpl 的初始化里做了非常多的事情&#xff0c;初始化各种资源&#xff0c;并调用 SchemaManagementToolCoordinat…

c语言基础--------字符串指针

在 C 语言中&#xff0c;字符串指针是一个指向字符类型的指针&#xff0c;通常用于指向字符串的第一个字符。字符串在 C 语言中通常表示为字符数组&#xff0c;而字符串指针则是用来存储这种字符数组首地址的变量。 定义字符串指针 字符串指针的定义方式如下&#xff1a; ch…

Android更改包名和签名

一、更改包名 1、包名——鼠标右键——Refactor——Rename 修改自己想更改的包名和选择更改范围后点击Refactor就可以了 2.手动修改app的build.gradle文件中的applicationId&#xff08;改成和我们之前修改的包名相同&#xff09; 3.修改AndroidManifest.xml文件中的packag…

“AI+Security”系列第2期(三):面向LLM(大语言模型)的漏洞挖掘与对齐防御研究

近日&#xff0c;由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗&#xff01;大模型自身安全的攻防博弈线上活动如期举行。 在此次活动中&#xff0c;前阿里云高级安全专家郑瀚带来了以《通往LLM安全对齐的道路…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好&#xff0c;我是程序员鱼皮&#xff0c;8 月 19 日下午&#xff0c;网易云音乐突发严重故障&#xff0c;并登顶微博热搜&#xff0c;跟黑神话悟空抢了热度。 根据用户的反馈&#xff0c;故障的具体表现为&#xff1a;用户无法登录、歌单加载失败、播放信息获取失败、无法…

SQL— DML语句学习【后端 10】

数据库操作-DML 详解 在数据库管理系统中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09;扮演着至关重要的角色&#xff0c;它负责对数据库中的数据进行增、删、改操作。掌握DML操作对于数据库的日常维护和管理至关重要。本文将详…

CSP 2023 普及组第一轮 - CSP/S 2023初试题 完善程序第二题解析

一、题目阅读 &#xff08;编辑距离&#xff09;给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;、替换&#xff08;Replace&#xff09;&#xff0c;一个字符&#xff0c;求将第一个字符串转换为第二个字…

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…

【C++ 第十二章】二叉搜索树

1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 左边小&#xff1a;若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值右边大&#xff1a;若它的右子树不为空&#xff0c;则右子树上…