这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
自动内存管理
动态内存:程序在运行时根据需求动态分配的内存:malloc()
内存管理问题( 垃圾回收(GC) )
容易出现的问题:
double-free(重复释放内存)
use-after-free(使用释放过的内存)
三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
相关概念
- Mutator:业务线程,分配新对象,修改对象指向关系
- Collector: GC线程,找到存活对象,回收死亡对象的内存空间
GC按方式分类
- Serial GC:只有一个collector
- Parallel GC:支持多个collectors同时回收的GC算法
- Concurrent GC: mutator(s)和collector(s)可以同时执行
自动内存管理算法
评价GC算法
GC算法
追踪垃圾回收(Tracing garbage collection)
回收指针指向关系不可达的对象
1.标记根对象
静态变量、全局变量、常量线程栈等
2.标记可达对象
求指针指向关系的传递闭包:从根对象出发,找到所有可达对象
3.清理不可达对象
copying CG
将存活对象复制到另外的内存空间
Mark-sweep GC
将死亡对象的内存标记为可分配
Mark-Compact GC
原地移动并整理存活对象
引用计数(Reference counting)
节点存储被引用的次数,若次数为零,则被清除
分代GC
年轻代和老年代采取不同的策略
年龄:经历过GC的次数
Go内存管理
TCmalloc
提到malloc,就不得不提google开发的大名鼎鼎的TCmalloc(Thread caching Malloc),即 线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free,new,new[]等)
From:
go内存策略
分配路径: g->m->p->mcache->mspan->memory block -> return pointer
编译器优化
编译器的结构:
这里我们学习后端的两个部分