内存管理
内存管理-内存分配
分配器
线性分配器
空闲链表分配器
go内存管理
- 主要指堆、栈内存的分配和回收
- 借鉴了TCMalloc内存分配思想:缓存、分级分配
- 增加了逃逸分析、gc
go内存分配组成部分
- page:内存被划分成大小不等的页
- span(跨度):内存管理的基本单位,一组连续的page组成一个span
- mcache:类似TCMalloc的线程缓存,go的每个P挂载一个mcache,可以无锁访问
- mcentral:类似TCMalloc的中心缓存,线程共享,需要加锁访问
- mheap:与TCMalloc中的PageHeap类似,也需要加锁访问
go小对象分配
- 1、计算对象所需要的内存大小
- 2、跟进转化表,找出所属的span(跨度)
- 3、从span中分配对象空间,按照隔离适应的方式
- 4、优先从mcache中的span分配,若不够,从mcentral中申请span
- 5、若mcentral中也不够,向mheap申请
- 6、mheap向os申请
go大对象分配
- 直接向mheap申请
参考
- https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator/
- https://segmentfault.com/a/1190000020338427
- https://blog.csdn.net/aaronjzhang/article/details/8696212
内存管理-垃圾回收
回收机制:并行
- GC触发条件
- 超过内存的阈值
- 到达特定的时间
- 手动GC
- 参考
- https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/
- https://juejin.cn/post/6844903917650722829
逃逸分析
- 定义:go的内存分配由编译器完成,通过逃逸分析,决定内存分配是在栈上还是在堆上。若变量的生命周期是完全可知,则分配到栈上,否则分配到堆(逃逸)。
- 编译器尽可能地内存分配到栈,几种内存分配到堆得情况(逃逸)
- 变量类型不确定
- 函数内暴露给外部的指针
- 变量所占内存较大
- 变量的大小不确定
- 逃逸分析的作用:写出更好的程序,使内存尽可能地分配到栈,减小gc压力,减少内存分配开销。
- 参考
- 逃逸分析:https://mp.weixin.qq.com/s/xhBVv6JEPY8R3kCJlbirYw
- 堆:https://www.jianshu.com/p/6b526aa481b1
内存分析
- 参考:https://www.oschina.net/translate/debugging-performance-issues-in-go-programs
This post is licensed under CC BY 4.0 by the author.