记杂||go的内存分配管理

本文类似于个人学习笔记不会面面俱到,需要读者掌握一定基本知识。

先从span讲起,span是go内存的最小管理单位,最小存储单位page为8KB,span便是page的整数倍大小,从8B到32KB共67个等级+0级(我所学习的教材写成了67种,后来发现他写错了,源码部分在runtime/sizeclasses.go 内有详细数据),其中0级代表大小不确定的等级。span的大小和等级并不相同,比如class1 span为8B而span的大小为8KB,也就是说能装下1024个大小为8B的对象。接下来的内容便围绕着span展开:

go使用了一种现代化的内存分配算法TCMalloc,在此基础上进行了三级管理:mcache,mcentral,mheap。

  1. mcache:中内含 (67种span+1)*(有无指针2种,GC时使用) 共136个span,span为每个P独占,由于P上只会有一个G在运行所以无需加锁,同时也意味着mcache的数量和P相等(注:在初始化时并没有任何span而是在使用时向mcentral申请并缓存)。
  2. mcentral:为链表结构共 两条(空闲列表和无空闲)*67种 每一级别的span各有一个对应的mcentral,mcentral内span的数量并不固定,如果不够用了则会向mheap申请,全局P共享。
  3. mheap:全局内存池,便是go运行时向操作系统申请的一大块内存,这里你可能有个误区,栈在什么地方分配内存?没错也在mheap,与java不同,栈的内存也是分配在堆上的。

为什么要这么分?先看go是怎么为对象分配内存的,go的对象分为了3种:微小对象<16B,16B<小对象<32KB,大对象>32KB。这里微小对象和小对象在span中便有足够大的空间分配,所以分配在mcahe中,其中微小对象会放在span的class 2(16B)中,根据2,4,8规则进行字节对齐,这是一种优化手段可以有效减少堆大小,甚至8B的对象并不会放在class 1中,优先把2*8B放在class 2中以减少位图等用于记录的数据。而mcache中如果span满了,便会去向对应mcentral中申请(加锁)(2条链表都遍历,因为由于GC无法保证无空闲链表中是否已经出现了空闲的)新的span,而原来的会标记为空闲,放在mcentral的空闲列表中等待GC,如果mcentral也没有可用的了,便会向mheap申请(全局锁)。而大对象便直接在mheap中进行内存分配。

~飞天大糙

Go八股文小解 文章被收录于专栏

Lotalot你干了什么?!没有golang八股文我们如何抗衡双招,Lotalot淡笑一声:“很简单,我自己写不就是了”说完,他气息终于不再掩饰,显露而出,Go八股文小解!

全部评论

相关推荐

03-15 19:08
南昌大学 Java
1.&nbsp;自我介绍2.&nbsp;介绍计算机网络模型3.&nbsp;TCP&nbsp;和UDP的区别,UDP的应用场景4.&nbsp;怎么理解get&nbsp;和&nbsp;post&nbsp;的安全性(考察HTTPS&nbsp;如何确保安全)5.&nbsp;进程和线程的区别6.&nbsp;如何保证多线程的线程安全(JAVA&nbsp;里是通过原子性,可见性,有序性)7.&nbsp;MySQL&nbsp;索引以及底层实现8.&nbsp;索引失效场景9.&nbsp;B+树的插入操作10.&nbsp;二叉树的中序遍历(easy)11.&nbsp;Redis&nbsp;为什么快12.&nbsp;有哪些底层的数据结构String&nbsp;的实现SDS,查询字符串长度为O(1);跳表的实现原理,和平衡树,红黑树,B+树的对比12.&nbsp;大Key问题怎么解决(拓展热Key&nbsp;&nbsp;问题)#牛客AI配图神器#拆分,清理,监控内存、带宽、超时等指标,定期清理失效数据13.&nbsp;数据库和Redis&nbsp;一致性(答的不好)14.&nbsp;缓存穿透问题15.&nbsp;JVM&nbsp;垃圾回收机制16.&nbsp;缓存热点数据如何做的17.&nbsp;基于用户的协同过滤算法18.&nbsp;推荐系统怎么避免信息茧房&nbsp;&nbsp;a.&nbsp;多样性推荐:反向兴趣推荐,探索与开发模式&nbsp;&nbsp;b.&nbsp;去偏见算法:公平性约束,平衡曝光机制&nbsp;&nbsp;c.&nbsp;用户主导:自己选择喜好,内容探索&nbsp;&nbsp;d.&nbsp;随机性和跨领域推送19.&nbsp;激励机制如何设计按照签到时长来赠送体验卡,书籍20.&nbsp;签到怎么做的,bitmap&nbsp;的优点
肯德基老头爱吃麦当劳:问一下这个推荐系统是根据项目扩展的嘛
查看23道真题和解析
点赞 评论 收藏
分享
03-29 15:54
四川大学 golang
点赞 评论 收藏
分享
03-12 20:39
门头沟学院 Java
---####&nbsp;**一、项目相关**1.&nbsp;**超卖问题解决方案**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;如何通过乐观锁解决库存超卖?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;分布式锁(Redis)如何实现一人一单限制?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;乐观锁失败后的处理机制(直接返回失败?是否有重试?)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;分布式锁超时场景下的问题(锁提前释放导致并发问题,看门狗机制如何续期?)2.&nbsp;**Redis应用**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;CAP理论在Redis主从模式中的体现(主从异步复制牺牲一致性保证可用性)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Redis哨兵模式与集群模式的区别?---####&nbsp;**二、数据库**1.&nbsp;**MySQL事务**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;事务隔离级别有哪些?默认级别是什么?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;事务传播机制(如`PROPAGATION_REQUIRED`、`PROPAGATION_REQUIRES_NEW`的区别)&nbsp;&nbsp;---####&nbsp;**三、并发与多线程**1.&nbsp;**线程池**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;核心参数(核心线程数、最大线程数、队列类型、拒绝策略)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;工作原理(任务提交流程、非核心线程创建条件)&nbsp;&nbsp;2.&nbsp;**锁机制**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;分布式锁(Redisson)与本地锁(synchronized)的适用场景差异&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;乐观锁实现方式(MySQL的CAS操作)&nbsp;&nbsp;---####&nbsp;**四、Java基础**1.&nbsp;**类加载机制**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;双亲委派模型流程及作用(保护核心类库)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;如何打破双亲委派(自定义类加载器重写`loadClass`方法)&nbsp;&nbsp;2.&nbsp;**集合框架**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;HashMap冲突解决(链表转红黑树)&nbsp;&nbsp;---####&nbsp;**五、操作系统**1.&nbsp;**内存管理**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;页面置换中的“抖动”现象(频繁换页导致性能下降)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;页面置换算法(LRU、LFU、FIFO)&nbsp;&nbsp;2.&nbsp;**调度算法**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;常见作业调度算法(短作业优先、长作业优先、高响应比优先)&nbsp;&nbsp;---####&nbsp;**六、网络**1.&nbsp;**TCP协议**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;TCP报文头字段(源/目的端口、序列号、ACK/SYN/FIN标志位、窗口大小)&nbsp;&nbsp;---####&nbsp;**七、算法与数据结构**1.&nbsp;**堆的应用**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;优先级队列底层实现(最大堆/最小堆)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Top&nbsp;K问题解法(维护大小为K的最小堆)&nbsp;&nbsp;2.&nbsp;**经典算法**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;快排实现思路(基准选择、分区、递归)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;最短路径算法(Dijkstra、Floyd)&nbsp;&nbsp;3.&nbsp;**编程题**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;**硬币找零问题**(动态规划,求最少硬币数)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;**字符串频次统计**(前缀和优化查询效率)&nbsp;&nbsp;---####&nbsp;**八、其他**1.&nbsp;**系统设计**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;CAP理论的实际取舍(Redis主从模式牺牲C保证AP)&nbsp;&nbsp;---###&nbsp;**参考答案/关键点**1.&nbsp;**乐观锁与分布式锁**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;乐观锁通过版本号/CAS实现,失败后直接返回错误;分布式锁需结合超时和续期机制(Redisson看门狗)。&nbsp;&nbsp;2.&nbsp;**事务传播机制**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;`PROPAGATION_REQUIRED`:加入当前事务;`PROPAGATION_REQUIRES_NEW`:新建独立事务。&nbsp;&nbsp;3.&nbsp;**双亲委派打破**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;自定义类加载器重写`loadClass`方法,如Tomcat为隔离Web应用打破委派。&nbsp;&nbsp;4.&nbsp;**TCP三次握手**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;SYN、SYN-ACK、ACK报文交互,序列号保证可靠传输。
查看25道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务