这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
go语言的内存管理重要的核心思量分为以下几点:
①每次从操作系统申请一大块儿的内存,由Go来对这块儿内存做分配,减少系统调用
②内存分配算法采用Google的TCMalloc算法。其核心思想就是把内存切分的非常的细小,分为多级管理,以降低锁的粒度。
③回收对象内存时,并没有将其真正释放掉,只是放回预先分配的大块内存中,以便复用。只有内存闲置过多的时候,才会尝试归还部分内存给操作系统,降低整体开销
1、自动内存管理
追踪垃圾回收机制 分代GC 引用计数
2、go内存管理及优化
go内存分配—分块 go内存分配—缓存 利用balanced gc进行优化
3、编译器及静态分析
过程内分析和过程中分析的区别和详细过程
4、go编译器的优化问题
(1)函数内联
内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。 Note:内联优化一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出,同时内联体量小的函数也不会明显增加编译后的执行文件占用的空间。
(2)逃逸分析
从对象分配处出发,沿着控制流,观察数据流。若发现指针 p 在当前作用域 s: ①.作为参数传递给其他函数; ②.传递给全局变量; ③.传递给其他的 goroutine; ④.传递给已逃逸的指针指向的对象; 则指针 p 逃逸出 s,反之则没有逃逸出 s.
优化:未逃逸出当前函数的指针指向的对象可以在栈上分配 ①.对象在栈上分配和回收很快:移动 sp 即可完成内存的分配和回收; ②.减少在堆上分配对象,降低 GC 负担。
(3)默认栈大小调整
(4)边界检查消除