课程导学:https://juejin.cn/post/7095977466094682148/#comment
课程ppt:https://bytedance.feishu.cn/file/boxcnRcx62rX5X22Q2WFR5Xm5Oh
课程链接:https://live.juejin.cn/4354/yc_high-performance
本节课程主要介绍了Go语言的内存管理方式,Go编译器的工作流程。在此基础上给出了字节内部对于Go内存管理的优化方案Balanced GC,以及编译器优化Beast Mode。
(建议使用web端阅读)
Mutator
:业务线程,分配新对象,修改对象指向关系(人为创建的goroutine
)Collector
:GC线程,找到存活对象,回收死亡对象的内存空间Serial GC
:只有一个collector(stop the world)Parallel GC
:支持多个collectors同时回收的GC算法Concurrent GC
:mutator(s)和collector(s)可以同时执行的算法collectors
必须感知对象指向关系的改变一种用于判断哪些对象需要被回收的算法(这是垃圾回收的第一步,还不涉及到清理的过程)
copying collection
(HotSpot 虚拟机年轻代eden区from区和to区比例为:8:1:1)mark-sweep collection
(原地标记死亡对象可分配,碎片多了就来一遍compact collection
)这个垃圾回收体系和基于追踪的可达性分析算法体系是不同的,其内存管理的操作被平摊到了程序的执行过程当中
mmap()
,向OS申请一块大内存,如4MBmspan
noscan mspan
:分配不包含指针的对象——GC不需要扫描scan mspan
:分配包含指针的对象——GC需要扫描thread caching
mcache
用于快速分配,用于为绑定于p上的g分配对象mcache
管理一组mspan
mcache
中的mspan
分配完毕,向mcentral
申请带有未分配块的mspan
mspan
中没有分配的对象,mspan
会被缓存在mcentral
中,而不是立即释放归还给OSg -> m -> p -> mcache -> mspan -> memory block -> return pointer
goroutine allocation buffer
(GAB)将过程间分析转化成过程内分析
,帮助其他优化,例如逃逸分析