”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 引用计数与跟踪垃圾收集

引用计数与跟踪垃圾收集

发布于2024-11-09
浏览:980

Reference Counting vs Tracing Garbage Collection

你好,Mentes Tech!

您知道内存释放上下文中的引用计数和引用跟踪是什么吗?

引用跟踪(或跟踪垃圾收集)和引用计数(引用计数)之间的区别在于每种技术用于识别和释放不存在的对象内存的方法。使用时间更长。
我将解释每一个,然后强调主要差异。

引用计数(引用计数

  • 工作原理:内存中的每个对象都有一个计数器,用于跟踪有多少引用(或指针)指向它。当创建对该对象的新引用时,计数器就会递增。当引用被移除时,计数器就会递减。如果计数器达到零,则意味着该对象不再可访问并且可以被释放(其内存可以被折叠)。

  • 优点

    • 易于理解和实施。
    • 当计数器为零时立即收集内存,这样可以减少内存使用量。
  • 缺点

    • 引用循环:如果两个或多个对象在一个循环中互相引用,它们的引用计数永远不会达到零,从而导致内存泄漏。
    • 可能效率较低,因为每个引用创建或删除都需要计数器更新,这可能会影响性能。

引用跟踪(跟踪垃圾收集

  • 工作原理:此方法涉及两个主要阶段:标记扫描。首先,垃圾收集器从根(例如全局变量、局部变量和寄存器)开始,跟踪对内存中对象的所有引用,标记那些可访问的对象。然后,它扫描内存以收集尚未标记的(空闲)对象,因为这些对象不再可访问。

  • 优点

    • 不会遇到引用循环问题,因为垃圾收集器能够识别不再可访问的对象,无论循环如何。
    • 对于某些类型的应用程序来说,在运行时方面可能会更高效,特别是在具有复杂内存管理的语言中。
  • 缺点

    • 可能会在程序执行中引入暂停,尽管现代垃圾收集器(例如 Go)旨在最大限度地减少这些暂停。
    • 一般来说,跟踪过程可能比引用计数更复杂、更耗费资源,具体取决于垃圾收集器的实现方式。

主要区别

  1. 周期管理:

    • 引用计数:引用循环问题,其中两个或多个对象相互引用,导致内存泄漏。
    • 跟踪:循环没有问题,因为收集器跟踪并标记所有可访问的对象。
  2. 复杂性和性能

    • 引用计数:简单,但每次递增和递减操作都会影响性能,尤其是在使用指针执行许多操作的程序中。
    • 跟踪:更复杂,可能导致程序执行暂停,但通常在处理不同的内存使用模式时更有效。
  3. 领取时间

    • 引用计数:当计数达到零时立即收集内存。
    • 跟踪:当垃圾收集器运行其周期时定期收集内存。
  4. 执行

    • 引用计数:实现起来更简单,但在复杂的应用程序中鲁棒性较差。
    • 跟踪:更强大,但实现垃圾收集器可能相当复杂。

综上所述,引用计数更简单、更即时,但在某些场景下(例如引用循环)可能会失败,而跟踪则更健壮和灵活,但由于其复杂性可能对性能产生较大影响执行。

版本声明 本文转载于:https://dev.to/devxbr/reference-counting-vs-tracing-garbage-collection-51ac?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-08
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-08
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-04-08
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-08
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-08
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-08
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-08
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-08
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-04-08
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-08
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-08
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-04-08
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-04-08
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3