【每日八股】Golang篇(五):垃圾回收

devtools/2025/3/14 11:10:59/

目录

  • golang 的垃圾回收?
  • 写屏障?
  • 垃圾回收的触发条件?

golang__1">golang 的垃圾回收?

golang GC 算法使用的是无分代(对象没有代际之分)、不整理(回收过程中不对对象进行移动和整理)、并发(与用户代码并发执行)的三色标记清扫算法。

三色标记清扫算法将对象分为三类,分别是:

  • 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,回收结束后,白色对象均不可达;
  • 灰色对象(波面):已经被回收器访问到的对象,但回收期需要对其中的一个或多个指针进行扫描,因为指针指向的可能是白色对象;
  • 黑色对象(确定存活):已被回收器访问到的对象,其中所有字段均已被扫描,黑色对象中任意一个指针都不可能直接指向白色对象。

对象颜色标记的过程如下:

  • 第一步:初始化所有对象为白色的;
  • 第二步:从根对象出发扫描所有可达对象,标记为灰色,放入待处理队列;
  • 第三步:从待处理队列取出灰色对象,将其引用的对象标记为灰色,并放入待处理队列中,当前对象标记为黑色;
  • 重复第三步,直到待处理队列为空,此时白色对象积为不可达的“垃圾”对象,回收白色对象。

写屏障?

由于颜色标记与垃圾回收和程序执行是并发的,在标记的过程中,难免会出现以下极端情况:清扫开始前,标记为黑色的对象引用了一个新申请的对象,它肯定是白色的,而由于黑色对象不会被再次扫描,那么这个白色对象就会在扫描结束后被当作真正的白色对象回收掉。

为了避免上述极端情况的产生,golang 采用写屏障,作用就是为了避免勿清扫。具体来说,写屏障在内存的写操作前,维护一个约束,从而确保清扫开始前,黑色对象不能够引用白色对象。GC 一旦开始执行,无论是创建对象还是改变对象的引用,一律将新创建的或新引用的对象标记为灰色的,进入待处理队列,这样可以保证它们至少不会在本次 GC 被误删除。

垃圾回收的触发条件?

  • 系统触发:运行时自行根据内置的条件,检查、发现,并执行 GC,确保整个程序的可用性;
  • 系统监控:当超过 2 min 没有 GC 时,强制调用 GC;
  • 步调(Pacing)算法:其核心思想是控制内存增长的比例,当内存达到一定比例时触发 GC;
  • 触发:业务代码中手动调用 runtime.GC 触发 GC。

http://www.ppmy.cn/devtools/166713.html

相关文章

AI+API引爆数据分析:BI已成过去?

目录 1 BI的瓶颈与新时代的需求 2 AI与API如何重塑数据分析? 3 QuickAPI:AI与API的桥梁 4 数据分析的未来:智能、互联、即时 5 结语 在过去十年中,商业智能(BI)一直是企业数据分析的基石。仪表盘、报表…

新型神经网络KAN:准确性高且易于解释

人工神经网络(ANN)是现代人工智能的核心技术,广泛应用于聊天机器人、图像生成器等领域。然而,传统的神经网络由于其复杂的结构和大量的神经元连接,往往被视为“黑匣子”,难以解释其内部工作原理。近年来&am…

Uniapp实现多种文件类型上传

一、前言 在移动端开发中,文件上传是常见的功能需求。本文将通过Uniapp框架,详细讲解如何实现支持多类型文件(图片、视频、文档等)的上传功能,并解决跨平台兼容性问题😄😄😄。 二、…

中国软件供应链安全技术指南|DevSecOps敏捷安全技术金字塔V3.0正式发布

2022年12月28日,由悬镜安全主办,3S-Lab软件供应链安全实验室、Linux基金会OpenChain社区、ISC、OpenSCA社区联合协办的第二届全球DevSecOps敏捷安全大会(DSO 2022)已通过全球直播的形式圆满举行。本届大会以“共生敏捷进化”为主题…

在线商城服务器

1、项目背景 本项目是一个基于 C语言 开发的轻量级 HTTP 服务器,旨在实现基本的静态文件服务和简单的动态请求处理。 核心目标: 支持 HTTP/1.1 协议的 GET/POST 请求解析与响应。 提供静态资源(HTML、图片等)的快速分发。 作为学…

eclipse运行问题

你在 D:\Personal_Finance_System\eclipse\eclipse\configuration 目录下没有发现 .log 文件: 方法 :强制 Eclipse 生成日志 如果 .log 文件不存在,可以尝试让 Eclipse 以 -consoleLog 模式运行,查看错误信息: 打开…

一个差劲的软件设计

项目概况: 之前自己设计并开发了一个用C#开发的上位机软件,整个软件只有一个Form,一个TabControl,3个TabControlPanel,总共100多个lable、textbox、ListBox等控件都放在这3个TabControlPanel里。 问题: 1.…

《C++探幽:运算符重载》

《C探幽:运算符重载》 一、引言 在C中,运算符重载是一项非常强大的特性,它允许程序员重新定义运算符在自定义类型上的行为。通过运算符重载,我们可以让自定义类型(如类和结构体)的对象像内置类型一样使用运算符&…