Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

40|资源调度:深入内存管理与垃圾回收

你好,我是郑建勋。
程序的快速运行离不开内存这个重要的资源,存储在内存里的数据可以比磁盘等介质更快地被 CPU 访问。但是内存是有限的,当多个进程共用内存空间时更是如此。因此,合理安排、组织、管理、释放内存是构建高效程序的基础。
现代高级语言一般都为我们屏蔽了内存分配的细节,但是程序内存分配过大、内存泄露以及垃圾回收导致的性能下降却是非常常见的。了解 Go 内存管理的细节也有助于我们排查艰难的系统问题,指导我们写出高性能程序。
Go 语言运行时依靠细微的对象切割、极致的多级缓存、精准的位图管理实现了对内存的精细化管理。下面我们就来看一看具体是如何实现的。

内存

在计算机中,内存又叫做主存,通常指的是可寻址的半导体存储器(硅基 MOS 晶体管组成的集成电路)。内存可分为非易失性内存和易失性内存两种,非易失性内存主要用于存储特殊的程序(例如 BIOS),易失性内存通常指的是 RAM(Random Access Memory,随机存储器)。主要用于存储当前正在使用的数据和机器码。
不管数据在物理内存的哪里,RAM 几乎都允许在相同的时间内读取或写入数据。我们可以将物理内存视为下面这样的单元阵列,每一个单元可容纳 8 位的信息。每个内存单元都有一个地址,CPU 可以通过寻址读取或者写入特定地址的数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言的内存管理和垃圾回收是本文的重点内容。文章深入探讨了Go语言采用的现代TCMalloc算法,以及通过mcache、mcentral和mheap三级管理结构实现内存分配的流程。此外,垃圾回收算法采用了并发三色标记-清扫算法,经历了多次演进,大幅降低了用户协程暂停的时间。文章还介绍了垃圾回收的各个阶段,包括标记准备、并发标记、标记终止和垃圾清扫阶段,以及Go语言的垃圾回收API。总的来说,Go语言在内存管理和垃圾回收方面具有较高的效率和性能,为读者提供了深入了解现代内存管理和垃圾回收技术的重要参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • Realm
    1. Golang的内存碎片问题,在用户态进行管理,操作系统层面觉得没有碎片; 2. Golang将内存分成了大大小小 67 个级别的 span,每次按需申请接近大小的span,并且也是按span进行GC,内部碎片带来的浪费影响相对较小; 3. 可能有些较小的外部碎片; 可能总体觉得必要性不大。
    2023-01-12归属地:浙江
    1
  • 666
    原文:“pallocSum 是一个简单的 uint64,分为开头(start)、中间(max)、末尾(end)三部分,pallocSum 的开头与末尾部分各占 21bit,中间部分占 22bit,它们分别包含了这个区域中连续空闲内存页的信息。对于最顶层的节点,由于其 max 位为 22bit” 我阅读代码发现,中间部分其实也只占 22bit,只有一种情况:max == maxPackedValue 时,设置第64位来表示的。请问老师是否是这样呢?
    2023-04-21归属地:四川
    1
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部