什么是逃逸

从栈(Stack)上跑到堆(Heap)上

什么情况下要逃逸

变量太大

栈针回收以后,继续使用的变量

逃逸方式

指针逃逸

函数返回的是对象的指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func escapeHeap01() *int {
v := 100
return &v
}

func main() {
p := escapeHeap01()
fmt.Println(p)
}

上面代码,如果不是返回的指针,只是一个普通的Int,那么,函数会从栈中弹出,返回,但是由于escapeHeap01()调用后,返回一个指针,也就是指向了局部变量的地址,所以会逃逸到Heap上。

空接口逃逸

因为空接口作为参数,函数内部会调用反射,要查看实参的类型,反射要求变量要求在heap上,所以要逃逸。

1
2
3
4
func escapeHeap02() {
s := "面向加薪学习"
fmt.Println(s)
}

大变量逃逸

大于64k变量算大变量,一般会逃逸,缓解栈空间不足的问题。

调用方法嵌套过多

调用方法嵌套过多,导致栈空间不足,可以进行栈扩容,调用morestack()。

如何学习Go语言微服务,快速步入架构师

从0到Go语言微服务架构师-海报 从0到Go语言微服务架构师
添加微信 公众号更多内容
wechat gzh