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

98 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

自动内存管理

       自动内存管理的对象是动态内存,它是程序在运行过程中根据需求动态分配的内存。在实际程序中,数组、结构体等往往都不能提前预设大小,需要动态分配。比如在c语言中就常常使用malloc()函数动态分配内存。

       自动内存管理是一种垃圾回收机制,在程序运行时由系统管理动态内存(将内存管理交给系统,让我们更专注于业务逻辑),它需要保证内存的正确性和安全性。

       三个任务:为新对象分配空间、找到存活对象、回收死亡对象的内存空间

1 概念

       Mutator:业务线程,分配新对象,修改对象指向关系

       Collector:GC线程,找到存活对象,回收死亡对象的内存空间

以及三个不同类型的GC:

       Serial GC、Parallec GC、Concurrent GC

image.png

 

2 GC算法评价指标:

       安全性(Safety)、吞吐率(Throughput) 、暂停时间(Pause time)、内存开销(Space overhead)

3 追踪垃圾回收

       步骤:①标记根对象 ②标记:找到可达对象 ③清理:所有不可达对象

       清理方法有很多种,需要根据对象的生命周期,采用不同的标记和清理策略。常用的清理策略:

       Copying GC:将对象复制到另外的内存空间,这样原来空间就可使用;

image.png

       Mark sween GC:使用free list管理空闲内存,将可用内存空间标记为free,跳过不可用空间,使得内存空间可用;

image.png

       Compact GC:原地整理对象,和Copying G类似但不需要额外的空间。有一定的压缩功能

image.png

 

4 分代GC

       分代假说:很多对象被分配后很快就不再使用。因此分代GC是将对象分为年轻对象和老年对象,分别用不同GC策略管理。

       年轻对象:常规的对象分配,存活的对象少,因此采用cpoying GC,这样拷贝次数少,吞吐率高;

       老年对象:倾向于一直活着,反复复制开销较大,可以采用Mark sween GC。如果碎片太多,也可以使用Compact GC。

      

5 引用计数

       场景:每个对象都有一个与之关联的引用数目。

       对象存活的条件:当且仅当引用数大于0。