golang內(nèi)存逃逸

分析內(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)盡量避免使用指針類型,因為這個時候會分配到棧,減少逃逸的風險性能更好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容