内存分配/内存逃逸/GC

内存逃逸

  • https://juejin.cn/post/7155815911755087908
    分析准则
    • 指向栈对象的指针不能存储在堆中
    • 指向栈对象的指针不能超过该栈对象的存活期(即指针不能在栈对象被销毁后依旧存活)常见场景
    • 返回指向局部变量的指针
    • 将指针或包含指针的值存储到全局变量或接口中
    • 闭包捕获了外部函数的变量
    • 发送指针或包含指针的值到通道
    • 调用 fmt 等接口函数,且参数为 interface{}
    • 切片扩容后长度超过容量,重新分配底层数组
    • 调用 runtime 包中的某些函数或 new、make 的某些情况
    • 变量过大,超过栈的容量限制
    • 不确定大小的动态分配
// 逃逸分析
go build -gcflags="-m -m" main.go

GC

GMP调度

看完brpc的bthread之后再看go的协程调度,发现基本原理大致相同

  • 协程+队列+系统线程池
  • 协程可以视为任务
  • 每个队列绑定一个系统线程,当本队列空时,可以从其他队列偷取任务

参考资料