golang内存逃逸

分析内存逃逸的命令可以使用下面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) 切片元素是指针类型时,对切片元素惊醒赋值会导致元素发生逃逸

如果时大对象可以使用指针类型来传参,这样可以节省空间,
小对象应尽量避免使用指针类型,因为这个时候会分配到栈,减少逃逸的风险性能更好

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容