分析內(nèi)存逃逸的命令可以使用下面2種的任意一種
go tool compile -m -l main.go // 顯示內(nèi)存逃逸情況
go build -gcflags "-m -l" main.go // 顯示的更多的信息
1、函數(shù)返回后,函數(shù)中的對象依然可能存活
2、對象過大,超過??臻g的大小限制,例如一個變量超過了64k
3、不確定的切片大小的可能會出現(xiàn),例如
var length int
_ = make([]int, length) //這里會發(fā)生逃逸到堆上
4、接口類型可能會逃逸
(1) 函數(shù)返回接口類型,并且發(fā)生了類型轉(zhuǎn)換
func fn () interface { a := "aaaa" return a }
(2)容器類型(slice map) 元素為接口類型,并對接口類型進行賦值,會導
致容器的元素發(fā)生逃逸
func fn() { s := []interfacr{}{1,2} // 未發(fā)生逃逸 s[0] = 0 //發(fā)生逃逸 }
(3) 切片元素是指針類型時,對切片元素驚醒賦值會導致元素發(fā)生逃逸
如果時大對象可以使用指針類型來傳參,這樣可以節(jié)省空間,
小對象應(yīng)盡量避免使用指針類型,因為這個時候會分配到棧,減少逃逸的風險性能更好