golang内存管理
来源:互联网 发布:seo搜索排名优化怎么 编辑:程序博客网 时间:2024/06/05 14:58
最近粗略看了下golang内存初始化相关的代码,结合大牛们的一些源码分析,自己整理了一下学习总结。
几个关键数据结构
- mspan
由mheap管理的页面,记录了所分配的块大小和起始地址等 - mcache
与P(可看做cpu)绑定的线程级别的本地缓存 - mcenter
全局空间的缓存,收集了各种大小(67种)的span列表 - mheap
分配内存的堆分配器,以8kb进行页管理 - fixalloc
固定尺寸的堆外对象空闲列表分配器,用来管理分配器的存储
内存分配逻辑
- 如果object size>32KB, 则直接使用mheap来分配空间;
- 如果object size<16Byte, 则通过mcache的tiny分配器来分配(tiny可看作是一个指针offset);
- 如果object size在上面两者之间,首先尝试通过sizeclass对应的分配器分配;
- 如果mcache没有空闲的span, 则向mcentral申请空闲块;
- 如果mcentral也没空闲块,则向mheap申请并进行切分;
- 如果mheap也没合适的span,则向系统申请新的内存空间。
内存回收逻辑
- 如果object size>32KB, 直接将span返还给mheap的自由链;
- 如果object size<32KB, 查找object对应sizeclass, 归还到mcache自由链;
- 如果mcache自由链过长或内存过大,将部分span归还到mcentral;
- 如果某个范围的mspan都已经归还到mcentral,则将这部分mspan归还到mheap页堆;
- 而mheap不会定时将内存归还到系统,但会归还虚拟地址到物理内存的映射关系,当系统需要的时候可以回收这部分内存,否则暂时先留着给Go使用。
图解结构关系与内存布局
其他想说明的情况,我基本都放在图里了(画个图好累,很可能还画不准确,囧):
其他知识点
- 标示内存可用的常用两种方法
(1) 将所有可用内存块通过链表连接起来;
(2) 通过位图标志; - mcentral中用到的pad字段
主要是为了避免false sharing(伪共享)的性能问题; - 内存分配和tcmalloc理论类似
阅读全文
1 0
- golang手动管理内存
- golang内存管理
- 【golang 源码分析】内存分配与管理
- golang内存分配
- Golang 工程自管理
- golang程序版本管理
- Glide管理Golang项目
- golang-context(上下文管理)
- 修改golang最大内存限制
- golang获取服务内存信息
- 在线接口管理 angular2 + golang
- Golang的包管理、项目管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 结构体内的指针
- Android 相关词汇总结
- 使用nvm安装nodejs到非系统盘
- 随想
- 欢迎使用CSDN-markdown编辑器
- golang内存管理
- ubuntu16.04安装jdk并配置
- hdu 1394 Minimum Inversion Number 【线段树查找】
- 常见面试题
- Ubuntu terminal中添加命令执行路径
- Linux基础命令详解之目录管理
- 编译src.zip Java1.8 src.zip
- Day 1
- JAVA 中 Spring MVC模式