谈谈我的理解:引用计数 vs 可达性分析

前言

在学习垃圾回收机制时,首先需要了解如何判定哪些对象需要被回收,以及如何实现垃圾回收。本文将分享作者对两种常见的垃圾回收判断机制——引用计数法和可达性分析法——的理解与思考,旨在帮助读者更深入地理解这两种机制。

一、引用计数法

1.1、介绍

引用计数法为每个对象维护一个引用计数,表示有多少个引用指向该对象。当引用计数变为零时,表示该对象不再被使用,可以被回收。

1.2、优缺点分析

1.2.1、优点
  • 实时性:当对象的引用计数降为零时,立即释放内存,能够迅速回收不再使用的对象。

  • 简单易实现:实现相对简单,适合需要低延迟的应用场景。

1.2.2、缺点
  • 循环引用问题:如果两个或多个对象相互引用,引用计数无法正确回收这些对象,导致内存泄漏。

  • 额外开销:每次引用或取消引用时都需要更新计数,增加了额外的性能开销。

  • 内存 碎片问题:频繁的分配和释放内存可能导致内存碎片化。

1.3、循环引用问题的解决

普通引用计数法肯定是有循环引用问题的,但是也可以采取相应的措施来解决这个问题,在此,我们来介绍两种实现方式:

例如:

  1. 通过维护额外的“访问计数”或“引用链”来记录对象的引用关系,并将垃圾回收分两个阶段,首先是普通引用计数回收,第二阶段则是检查剩余对象是否存在循环引用。

    image-20241015164434454

  2. 也是维护额外“访问计数”或“引用链”来记录对象的引用关系,但是发现循环引用的时候,采用的是弱引用。

    image-20241015164654563

二、可达性分析法

2.1、介绍

可达性分析通过根对象(如全局变量、活动线程的局部变量等)来确定哪些对象是可达的。算法会标记所有可达的对象,然后清除未被标记的对象所占用的内存。

2.2、优缺点分析

2.2.1、优点
  • 处理循环引用:可达性分析可以有效地处理循环引用的问题,避免内存泄漏。

  • 不需要计数开销:不需要维护引用计数,减少了每次引用的开销。

2.2.2、缺点
  • 延迟回收:垃圾回收可能在某个特定的时刻发生,因此可能存在短期内无法释放内存的情况。

  • 实现复杂性:实现比引用计数法复杂,尤其是处理多线程和并发环境时。

  • 暂停应用程序:通常会暂停应用程序的执行以进行垃圾回收,可能导致用户体验不佳。

三、使用场景分析

这一部分,我将分析为什么Java中会使用可达性分析法,而在C/C++实现的一些嵌入式场景却要使用引用计数法。

我们知道引用计数法在对象不再使用时,引用计数会归零,并立即回收该对象的内存。因此,它非常适合实时性要求高的场景,因为内存的回收是即时的,能够快速释放不再使用的资源。然而,引用计数法也存在一个主要的局限——循环引用问题。当两个或多个对象相互引用时,即使它们已经不再被其他对象引用,引用计数也不会归零,导致内存无法被正确回收。为了解决这个问题,引用计数法通常需要额外的机制(例如周期性检查或手动触发的垃圾回收)来处理循环引用。

正是因为这个原因,引用计数法并不适用于像 Java 这种复杂的对象引用关系处理场景。Java 采用的是可达性分析来处理对象的回收,它更适合复杂的对象图结构,尤其是在存在循环引用的情况下,Java 的垃圾回收机制可以通过可达性分析检测出并回收这些对象,而不会依赖引用计数。

另一方面,对于嵌入式系统这种对垃圾回收实时性要求高,且内存资源有限的场景,引用计数法非常适用。嵌入式系统中的对象引用结构通常较为简单,不常出现循环引用问题。在这种场景中,程序的实时性能至关重要,而引用计数法能够帮助这些系统快速、即时地回收内存,以满足其实时性要求。因此,在嵌入式环境中,引用计数法的及时性和内存可预测性成为了其关键优势。

四、总结

在本文中,我们讨论了两种垃圾回收机制——引用计数法可达性分析法。引用计数法因其实时性简单性,适用于嵌入式等对回收延迟要求高的场景,但需要解决循环引用问题。而可达性分析法在处理复杂对象关系上更强,尤其适用于Java这类系统。同时选择哪种方法取决于应用的实时性、内存资源和引用结构。

所以,下次面试时,如果被问到这个问题,不要只提到可达性分析能解决循环引用问题。不妨通过对比引用计数法和可达性分析的优缺点,展示你对两者的深入思考,让面试官对你刮目相看吧。

最后的最后,觉得有收获?请为这篇文章点个赞,让我知道它帮助到了你!

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

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

相关文章

结合seata和2PC,简单聊聊seata源码

当前代码分析基于seata1.6.1 整体描述 整体代码流程可以描述为 TM开启全局事务,会调用TC来获取XID。TC在接收到通知后,会生成XID,然后会将当前全局事务保存到global_table表中,并且返回XID。在获取到XID后,会执行业务…

conda创建的新环境不干净!一定要注意!

总是出现明明是不同的环境,但是总是出现包交叉混用的问题,导致跑很多模型总是出现改了这个环境的包,那个环境又用不了了。就像下面这样,明明激活的是pyskl,安装mediapipe包显示在thwircamera中索引到就显示Requirement…

postgresql 安装

一、下载 PostgreSQL: File Browser 下载地址 PostgreSQL: File Browser 上传到服务器,并解压 二、安装依赖 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel 创建postgresql 和目录 useradd …

『Mysql集群』Mysql高可用集群之主从复制 (一)

Mysql主从复制模式 主从复制有一主一从、主主复制、一主多从、多主一从等多种模式. 我们可以根据它们的优缺点选择适合自身企业情况的主从复制模式进行搭建 . 一主一从 主主复制 (互为主从模式): 实现Mysql多活部署 一主多从: 提高整个集群的读能力 多主一从: 提高整个集群的…

一、定时器的时钟来源

计数器的时钟选择8个时钟源,可以分成4类: 一、来自RCC的内部时钟TIMx CLK 二、芯片内部其他定时器的触发输入ITR 使用某一个定时器作为另外一个定时器的分频 ITR1、ITR2、ITR3和ITR4 三、外部时钟源模式1: 外部捕获引脚上的边沿信号 TI1FP…

【jeston】torch相关环境安装

参考:玩转NVIDIA Jetson (25)— jetson 安装pytorch和torchvision 我的jeston信息: torch install 安装环境 conda create -n your_env python3.8 conda activate your_envpytorch_for_jeston 安装.whl文件 验证&#xff1…

循环神经网络(Recurrent Neural Network,RNN)

简介:个人学习分享,如有错误,欢迎批评指正。 一. 核心理念 循环神经网络(Recurrent Neural Network,RNN)是一类专门用于处理序列数据的神经网络架构。其独特之处在于能够处理输入序列中元素的时序关系&…

STM32定时器

目录 STM32定时器概述 STM32基本定时器 基本定时器的功能 STM32基本定时器的寄存器 STM32通用定时器 STM32定时器HAL库函数 STM32定时器概述 从本质上讲定时器就是“数字电路”课程中学过的计数器(Counter),它像“闹钟”一样忠实地为处…

41 C 语言共用体:共用体数据类型、共用体变量、访问共用体成员、与结构体的区别

目录 1 什么是共用体 2 共用体与结构体的区别 3 声明共用体类型 4 声明共用体变量 5 共用体内存分析 6 共用体成员的获取和赋值 7 综合案例 7.1 共同体特点演示 7.2 使用共用体存储学生和教师信息 1 什么是共用体 共用体(Union)是一种特殊的数据…

大型企业软件开发是什么样子的? - Web Dev Cody

引用自大型企业软件开发是什么样子的? - Web Dev Cody_哔哩哔哩_bilibili 一般来说 学技术的时候 我们会关注 开发语言特性 ,各种高级语法糖,底层技术 但是很少有关注到企业里面的开发流程,本着以终为始(以就业为导向…

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的,图像将以原…

An.如何在an中截取音频片段

如何在an中截取音频片段 在an动画制作过程中,部分片段需要插入音乐,如果想要插入一首歌曲的其中一小节,打开音频编辑软件操作就很麻烦,不妨直接在an中操作: 以这首节气歌为例,前奏太长需要剪掉前面的部分 …

TOGAF 9.2 与 TOGAF 10 的对比分析:架构演进之路

TOGAF 9.2 与 TOGAF 10 的对比分析:架构演进之路 前言 TOGAF(The Open Group Architecture Framework)自诞生以来,已成为企业架构(EA)领域的全球标准框架。随着时代的发展,TOGAF也在不断进化&…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

第二课:Python入门学习之开发工具的安装

今天我们进行Python开发工具的安装,其实网上的开发工具是很多的,每个人的习惯也都不一样,我们先去官网下载一个比较常用的吧。废话不多开始操作。 第一步:打开官网地址:https://www.jetbrains.com.cn/ 第二步&#xf…

面试题:Redis(三)

1. 面试题 背景 问题,上面业务逻辑你用java代码如何写? 2. 缓存双写一致性谈谈你的理解? 3. 双检加锁策略 多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。 其他的线程走到这…

微知-Mellanox驱动中的iSCSI是什么?有哪三种网络存储有哪三种?iSER是什么?(iSCSI协议(总线),SAN 存储区域网络)

背景 本文根据Mellanox网卡驱动中关于iSCSI模块,来介绍iSCSI是什么?该技术发展演进背景? 关于iSCSI iSCSI是一种协议,SCSI是总线。比如常说的SAS(Serial Attach SCSI)存储盘对比与家用的SATA&#xff0…

Uiautomator2与weditor配置一直报错咋办

作者在配置这两个的时候绞尽脑汁了,u2的init总是报错并且无法自动在手机上安装atx,weditor可以打开但是只要对元素操作或者任意操作就会让你去重新init,搞得作者焦头烂额,而且网上各种各样的报错信息眼花缭乱,作者几乎…

NVIDIA NIM平台如何打造AI图表识别系统

NVIDIA NIM是一套易于使用的推理微服务,旨在加速企业中性能优化的生成式 AI 模型的部署。 NIM 推理微服务可以部署在任何地方,从工作站和本地到云,提供企业控制自己的部署选择并确保数据安全。它还提供行业领先的延迟和吞吐量,实现…

使用Windows创建一个MFC应用【带界面】

MFC使用教程【对初学者保姆型友好!】 目录 前提条件 1:创建MFC应用程序 2. 项目结构解读 引用 外部依赖项 头文件 源文件 资源文件 文件功能详解 项目的主要流程 步骤2:配置OpenCV 安装OpenCV 包含目录与库文件 步骤3&#xff1…