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
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- Realm1. 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
收起评论