这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
在今天的学习中,着重学习了Go语言的内存管理机制. 不论什么具有GC的编程语言, 所对应的GC理论都是相通的,在业界都有相同且成熟的解决方案,因此这一章节的内容是十分重要的.
1. 自动内存管理
动态内存:程序在运行时根据需求动态分配的内存(需要手动管理内存) 自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内存使用的正确性和安全性
自动管理内存的三个任务:
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
相关概念:
追踪垃圾回收:
对象被回收的条件:
- 指针指向关系不可达的对象
- 标记根对象,找到可达的对象(静态变量,全局变量,常量,线程栈等)
- 清理所有不可达的对象
- 将存活对象复制到另外的内存空间(Copying GC)
- 将死亡对象的内存标记为"可分配"(Mark-sweep GC)
- 移动并整理存活对象(Mark-compact GC)
根据对象的生命周期,使用不同的标记和清理策略
分代GC(Generational GC):
引用计数
- 每个对象都有一个与之关联的引用数目
- 象存活的条件:当且仅当引用计数大于0
2. Go内存管理及优化
Go内存分配 -- 分块
- 为对象在heap上分配内存
- 提前将内存分块