面经-Golang
内存分配/内存逃逸/GC
- 内存管理原理:https://draven.co/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator
分配 - Golang内存管理—内存分配器
- 图解Go语言内存分配器
- 原理来源于google的tcmalloc
内存逃逸
- https://juejin.cn/post/7155815911755087908
分析准则- 指向栈对象的指针不能存储在堆中
- 指向栈对象的指针不能超过该栈对象的存活期(即指针不能在栈对象被销毁后依旧存活)常见场景
- 返回指向局部变量的指针
- 将指针或包含指针的值存储到全局变量或接口中
- 闭包捕获了外部函数的变量
- 发送指针或包含指针的值到通道
- 调用 fmt 等接口函数,且参数为 interface{}
- 切片扩容后长度超过容量,重新分配底层数组
- 调用 runtime 包中的某些函数或 new、make 的某些情况
- 变量过大,超过栈的容量限制
- 不确定大小的动态分配
// 逃逸分析
go build -gcflags="-m -m" main.go
GC
GMP调度
看完brpc的bthread之后再看go的协程调度,发现基本原理大致相同
- 协程+队列+系统线程池
- 协程可以视为任务
- 每个队列绑定一个系统线程,当本队列空时,可以从其他队列偷取任务
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Moyin!