Go 语言内存管理详解| 青训营笔记

66 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天 go语言的内存管理是建立在操作系统的内存管理之上的,它最大化程度上的发挥了操作系统内存管理层面的优势,避开了导致低效的情况。

go实现了主动申请与主动释放管理,增加了逃逸分析和GC(垃圾回收),将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。

重要的核心思量分为以下几点:

每次从操作系统申请一大块儿的内存,由Go来对这块儿内存做分配,减少系统调用 内存分配算法采用Google的TCMalloc算法。其核心思想就是把内存切分的非常的细小,分为多级管理,以降低锁的粒度。 回收对象内存时,并没有将其真正释放掉,只是放回预先分配的大块内存中,以便复用。只有内存闲置过多的时候,才会尝试归还部分内存给操作系统,降低整体开销 虚拟内存 我们知道由于CPU的访问速度远大于硬盘等存储设备的访问速度,所以为了弥补这两中硬件之间的速率差异,增加了比硬盘快很多的内存。摩尔定律告诉我们CPU的速率提高的很快,而内存速率增长的很慢,虽说近几年两者之间速率的差增长的较慢了,但是这种速率差依旧很大,所以又引入了比内存更快的Cache,我们对各个设备的访问速率进行简单的排名:

CPU寄存器 CPU cache 内存 硬盘等存储设备 鼠标等外设 除了速率冲突之外,为了实现多任务的需求,往往会出现一些问题:

内存访问冲突,这往往是多个程序使用同一块内存空间导致的; 内存不够用,每个程序都需要自己单独使用一块内存,内存大小就成了任务数量的瓶颈; 程序开发成本高,程序需使用多少内存,内存地址是多少,都不能搞错,正确的开发难度高。 所以引入了虚拟内存的概念,所有程序使用统一的连续虚拟内存,从程序角度来看它会觉得自己独享了一整块内存,这也就解决了第一个问题——冲突问题。

二来对于内存不够用的问题,虚拟内存本质上是将磁盘当成了最终存储,程序往往从虚拟内存上申请了很大的空间使用,但操作系统不会真的在物理内存上开辟大空间,往往只是开辟一小块。当程序访问内存时,操作系统发现访问的地址无法转为物理地址就在开辟空间给程序使用,如果成功转换,就正常访问。

对于进程而言虚拟内存屏蔽了底层的RAM和磁盘,并向进程提供了远超物理内存大小的内存空间。