Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

大咖助阵|曹春晖:聊聊 Go 语言的 GC 实现

归还内存给操作系统
清扫死对象
sweep.g 和 scvg.g 特殊goroutine
write barrier
对象丢失问题
协助标记
广度优先遍历
根对象扫描
三色抽象
offheap方案
使用sync.Pool
减少GC对应用延迟的影响
降低GC扫描成本
write barrier
协助标记流程
并发执行
无分代
回收流程
标记流程
alloc
mspan
page
arenas
推荐阅读《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》
针对性设计与优化
Go语言GC关键点
GC流程
垃圾分类:语义垃圾与语法垃圾
并发标记与清扫算法
内存分配的数据结构关系
tiny, small, large 对象分类
内存分配的多级缓存
mmap 系统调用
collector (垃圾回收器)
allocator (内存分配器)
mutator (应用)
抽象的成本:编译期或运行期
逃逸分析与GC结合
自动内存管理技术
需要手动管理内存释放
复杂的堆上对象引用关系
返回局部变量引用导致的dangling pointer
参考资源
问题分析
垃圾回收
Go语言内存分配
内存管理的三个参与者
Go语言GC简介
C语言内存管理问题
Go语言垃圾回收(GC)实现

该思维导图由 AI 生成,仅供参考

作者注:本文只作了解,不建议作为面试题考察。
你好,我是曹春晖,是《Go 语言高级编程》的作者之一。
今天我想跟你分享一下 Go 语言内存方面的话题,聊一聊 Go 语言中的垃圾回收(GC)机制的实现,希望你能从中有所收获。

武林秘籍救不了段错误

包教包会包分配
在各种流传甚广的 C 语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:
int * func(void) {
int num = 1234;
/* ... */
return #
}
duang!
当函数返回后,函数的栈帧(stack frame)就会被销毁,引用了被销毁位置的内存,轻则数据错乱,重则 segmentation fault。
可以说,即使经过了八十一难,终于成为了 C 语言绝世高手,我们还是逃不过复杂的堆上对象引用关系导致的 dangling pointer:
当 B 被 free 掉之后
你看,在这张图中,当 B 被 free 掉之后,应用程序依然可能会使用指向 B 的指针,这就是比较典型的 dangling pointer 问题,堆上的对象依赖关系可能会非常复杂。所以,我们要正确地写出 free 逻辑,还得先把对象图给画出来。
不过,依赖人去处理复杂的对象内存管理的问题是不科学、不合理的。C 和 C++ 程序员已经被折磨了数十年,我们不应该再重蹈覆辙了,于是,后来的很多编程语言就用上垃圾回收(GC)机制。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Go语言中的垃圾回收(GC)机制及内存管理的相关技术细节。首先指出了传统C语言内存管理存在的问题,并介绍了GC的作用及在Go语言中的具体实现方式,包括逃逸分析和内存分配器的设计。此外,还讨论了GC的成本以及可能引起的问题。文章还介绍了Go语言中内存分配的数据结构之间的关系,以及垃圾回收的实现流程,包括内存分配的多级路径和垃圾回收的并发标记与清扫算法。在讨论垃圾分类、GC流程、标记流程、协助标记和对象丢失问题等关键技术细节时,通过对三色抽象、标记过程和三色不变性的讲解,读者可以深入了解Go语言中垃圾回收的实现原理和内存管理的关键技术。此外,文章还详细解释了内存管理的三个参与者之间的交互过程,以及内存分配的细节,包括tiny、small和large类型的内存分配路径,以及页分配器的演进过程。总的来说,本文内容丰富,深入探讨了Go语言中GC的实现原理和内存管理的相关技术细节,对于想深入了解Go语言内存管理机制的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Tony Bai
    曹老师把GC原理讲得好通透!👍
    2022-02-12
    8
  • 叶剑峰
    膜拜曹大
    2022-02-16
    2
  • 骨汤鸡蛋面
    大佬,go 在变量赋值时调用 write barrier,可以多补充些细节嘛?
    2022-02-07
    4
    1
  • Niku
    曹神TQL
    2023-02-28归属地:中国香港
  • 怎么睡才能做这种梦
    看不懂噢
    2023-02-10归属地:湖北
  • simple_孙
    PauseNs数组中的数字是啥意思呢
    2022-03-19
    1
  • 曹大yyds
    2022-02-26
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部