分析内存逃逸的命令可以使用下面2种的任意一种
go tool compile -m -l main.go // 显示内存逃逸情况
go build -gcflags "-m -l" main.go // 显示的更多的信息
1、函数返回后,函数中的对象依然可能存活
2、对象过大,超过栈空间的大小限制,例如一个变量超过了64k
3、不确定的切片大小的可能会出现,例如
var length int
_ = make([]int, length) //这里会发生逃逸到堆上
4、接口类型可能会逃逸
(1) 函数返回接口类型,并且发生了类型转换
func fn () interface { a := "aaaa" return a }
(2)容器类型(slice map) 元素为接口类型,并对接口类型进行赋值,会导
致容器的元素发生逃逸
func fn() { s := []interfacr{}{1,2} // 未发生逃逸 s[0] = 0 //发生逃逸 }
(3) 切片元素是指针类型时,对切片元素惊醒赋值会导致元素发生逃逸
如果时大对象可以使用指针类型来传参,这样可以节省空间,
小对象应尽量避免使用指针类型,因为这个时候会分配到栈,减少逃逸的风险性能更好