GO语言的逃逸分析是什么?哪些情况会出现逃逸?
GO语言的逃逸分析是什么?哪些情况会出现逃逸?
提示
题眼: 栈上内容分配到了堆上。
Go 编译器在编译时会判断一个变量应该放在栈上还是堆上,这个过程就叫逃逸分析。
一般来说:
- 生命周期明确、不会逃出当前函数作用域的变量,更适合放在栈上。
- 生命周期不容易确定,或者可能在函数外继续被使用的变量,就可能逃逸到堆上。
常见的逃逸场景包括:
- 返回局部变量的地址。
- 变量被外部引用,比如闭包、全局结构、通道发送后长期持有。
- 变量体积太大,栈上放不下。
- 变量大小在编译期不容易确定。
- 某些接口装箱场景可能导致逃逸。
重要
参考答案:
逃逸分析简单说,就是编译器判断“这个变量能不能安全地放在栈上”。如果可以放栈上,那它跟着函数结束一起销毁,成本很低;如果不行,就得放到堆上,后续交给 GC 回收。
最典型的逃逸场景就是你把局部变量的地址返回出去了,或者它被闭包、接口、全局对象之类的结构继续引用。还有一种是变量太大,或者大小编译期不好确定,这种也可能直接分到堆上。
逃逸本身不等于错误,但逃逸多了通常意味着堆分配更多、GC 压力更大。所以开发里一般都会尽量减少不必要的指针传递、减少无意义的接口装箱,也可以借助编译器输出来观察逃逸情况。
