这是我参与「第五届青训营 」伴学笔记创作活动的第4天
本节课主要针对Go语言内存管理方面进行了详细解读,主要包括:自动化内存管理、Go内存管理及优化、编译器和静态分析、Go编译器优化。
自动化内存管理
概念:
1.自动内存管理:由程序语言的运行时系统管理动态内存
2.避免手动内存管理,专注于实现业务逻辑
3.保证内存使用的正确性和安全性: double-free problem, use-after-free problem
三个任务:
1.为新对象分配空间
2.找到存活对象
3.回收死亡对象的内存空间
内存分配和垃圾回收
内存管理器可以实时追踪堆中未被使用的内存区域,你也可以认为管理器保存有一张未使用区域的列表。当有新的内存块被请求时(换句话说就是有对象被初始化),管理器会选择堆中未使用区域的内存进行分配并将该部分内存移出未使用区域的列表。随后的请求都会按照相同的套路处理,直到没有足够大的内存块可以被分配位置。实际上此时堆中被分配出去的内存并不是都处于使用状态。堆中一个引用类型的数据只有在仍有引用类型变量指向它时才可能被访问和修改。所以当一个内存块的所有引用都消失时(例如引用变量被赋予新的内存地址或者作为局部变量超出作用范围),这块被占用的内存空间就可以被安全地回收了。
为了确保堆中某块内存不再被使用,内存管理器会搜索当前所有活跃的引用变量并且将他们引用的数据块标记为“存活”状态。在搜索结束后,所有位于“存活”区块之间的内存区域都会被当做未使用区域处理并且可以在后续的内存分配过程中使用。事实上,这种定位和释放未使用内存区域的过程就是大名鼎鼎的垃圾回收(Garbage Collection, 简写为GC)。
小结
本节课关于Go语言内存管理进行了详细了解,其中关于自动化内存管理感触很深,感受到框架学习过程中知识点不断递增的过程,希望可以继续有所收获。