| |
 
  |  
 
| 
	
开发:
C++知识库 
Java知识库 
JavaScript 
Python 
PHP知识库 
人工智能 
区块链 
大数据 
移动开发 
嵌入式 
开发工具 
数据结构与算法 
开发测试 
游戏开发 
网络协议 
系统运维 
 教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁  | 
	 
| -> C++知识库 -> Go 语言中的垃圾回收机制 GC 详解 -> 正文阅读 | 
|  
 | 
[C++知识库]Go 语言中的垃圾回收机制 GC 详解 | 
 
 Go 语言中的垃圾回收机制 GC 详解在计算机科学中,垃圾回收 (Garbage Collection 简称 GC) 是一种自动管理内存的机制,垃圾回收器会去尝试回收程序不再使用的对象及占用的内存 
 在计算中,内存空间包含两个重要的区域:栈区 (Stack) 和堆区 (Heap);栈区一般存储了函数调用的参数、返回值以及局部变量,不会产生内存碎片,由编译器管理,无需开发者管理;而堆区会产生内存碎片,在 Go 语言中堆区的对象由内存分配器分配并由垃圾收集器回收 通常,垃圾回收器的执行过程划分为两个半独立的组件: 
 一、内存管理和分配当内存不再使用时,Go 内存管理由其标准库自动执行,即从内存分配到 Go 集合。内存管理一般包含三个不同的组件,分别是用户程序 (Mutator)、分配器 (Allocator) 和收集器 (Collector),当用户程序申请内存时,它会通过内存分配器申请新内存,而分配器会负责从堆中初始化相应的内存区域 
 1.1 内存分配器的分配方法在编程语言中,内存分配器一般有两种分配方法: 
 线性分配器 线性分配 (Bump Allocator) 是一种高效的内存分配方法,但是有较大的局限性。当用户使用线性分配器时,只需要在内存中维护一个指向内存特定位置的指针,如果用户程序向分配器申请内存,分配器只需要检查剩余的空闲内存、返回分配的内存区域并修改指针在内存中的位置; 虽然线性分配器有较快的执行速度以及较低的实现复杂度,但线性分配器无法在内存释放后重用内存。如下图,如果已经分配的内存被回收,线性分配器无法重新利用红色的内存 
 因此线性分配器需要与适合的垃圾回收算法配合使用 
 以上算法可以通过拷贝的方式整理存活对象的碎片,将空闲内存定期合并,这样就能利用线性分配器的效率提升内存分配器的性能了 空闲链表分配器 空闲链表分配器 (Free-List Allocator) 可以重用已经被释放的内存,它在内部会维护一个类似链表的数据结构。当用户程序申请内存时,空闲链表分配器会依次遍历空闲的内存块,找到足够大的内存,然后申请新的资源并修改链表 
 空闲链表分配器常见有四种策略: 
 其中第四中策略与 Go 语言中使用的内存分配策略相似 该策略会将内存分割成由 4、8、16、32 字节的内存块组成的链表,当我们向内存分配器申请 8 字节的内存时,它会在上图中找到满足条件的空闲内存块并返回。隔离适应的分配策略减少了需要遍历的内存块数量,提高了内存分配的效率 1.2 Go 中的内存分配一张图展示内存分配组成: 
 在 Go 语言中,堆上的所有对象都会通过调用 runtime.newobject 函数分配内存,该函数会调用 runtime.mallocgc 分配指定大小的内存空间,这也是用户程序向堆上申请内存空间的必经函数  
从代码中可以看出  
 
 小分配 对于小于 32kb 的小分配,Go 会尝试从  
 每个线程 M 都分配给一个处理器 P,一次最多处理一个  大分配 
 二、垃圾回收在 Go 语言中,垃圾回收器实现的算法是一个并发的三色标记和扫描收集器 垃回收器与 Go 程序同时运行,因此需要通过一种写屏障算法来检测内存中的潜在变化。启动写屏障的唯一条件是在短时间内停止程序,即 “Stop the World” 
 
 2.1 实现原理Go 语言的垃圾收集可以分成清除终止、标记、标记终止和清除四个不同的阶段,其中两个阶段会产生 Stop The World (STW) 
 清除终止阶段 
 标记阶段 (STW) 
 标记终止阶段 (STW) 
 清理阶段 
 2.2 三色标记法三色标记算法将程序中的对象分成白色、黑色和灰色三类: 
 三色标记垃圾收集器的工作原理很简单,可以将其归纳成以下几个步骤: 
 
 参考[1] GC 的认识  | 
|  
 | 
| C++知识库 最新文章 | 
| 【C++】友元、嵌套类、异常、RTTI、类型转换 | 
| 通讯录的思路与实现(C语言) | 
| C++PrimerPlus 第七章 函数-C++的编程模块( | 
| Problem C: 算法9-9~9-12:平衡二叉树的基本 | 
| MSVC C++ UTF-8编程 | 
| C++进阶 多态原理 | 
| 简单string类c++实现 | 
| 我的年度总结 | 
| 【C语言】以深厚地基筑伟岸高楼-基础篇(六 | 
| c语言常见错误合集 | 
|  
 | 
| 上一篇文章 下一篇文章 查看所有文章 | 
	
  | 
| 
	
开发:
C++知识库 
Java知识库 
JavaScript 
Python 
PHP知识库 
人工智能 
区块链 
大数据 
移动开发 
嵌入式 
开发工具 
数据结构与算法 
开发测试 
游戏开发 
网络协议 
系统运维 
 教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁  | 
	 
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/4 7:56:34- | 
  |  
 
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |