Goland基础:自动内存管理 | 青训营笔记

140 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

一、自动内存管理

1.动态内存 程序运行时根据需求动态分配的内存molloc() 2.自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存 避免手动内存管理,专注于实现业务逻辑 保证内存使用的正确性和安全性 3.三个任务 为新对象分配空间 找到存货对象 回收死亡对象的内存空间

二、GC算法

1.安全性:不能回收存活的对象 (基本要求) 2.吞吐率:1 - GC时间/程序执行总时间 (花在GC上的时间) 3.暂停时间:stop the world (业务是否感知) 4.内存开销: GC元数据开销

三、追踪垃圾回收

1.对象被回收的条件:指针指向关系不可达到的对象 2.标记根对象 3.标记找到可达对象 4.清理所有不可达对象 5.根据对象的生命周期,使用不同的标记和清理策略

四、引用计数

1.每个对象都有一个与之关联的引用数目 2.对象存活的条件:当且仅当引用数大于0 3.优点:内存管理的操作被平摊到程序执行过程中 内存管理不需要了解runtime的实现细节:比如C++的智能指针 4.缺点:维护引用计数的开销大 无法回收环形数据结构 内存开销:每个对象都引入二外内存空间存储引用数目 回收内存依然可能引发暂停

五、Go内存分配—分块

1.目标:为对象在heap上分配 2.提前将内存分块 3.对象分配:根据对象大小,选择最合适的块返回

六、Go内存分配—缓存

1.每个P包含一个mcache用于快速分配,用于为绑定与P上的g分配对象 2.mcache管理一组mspan 3.当mcache中的mspan分配完毕,向mcentral申请带有未分配块的mspan 4.当mspan中没有分配对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS

七、Go内存管理优化

1.对象分配是非常高频的操作 2.小对象占比较高 3.Go内存分配比较耗时