golang中避免內存逃逸的方法有:1.盡量避免使用接口類型;2.避免使用變量指針作為參數;3.設定slice長度,避免容量超出;4.減少外部引用, 如指針;
出現內存逃逸的情況有:
1.發送指針或帶有指針的值到channel,因為編譯時候無法知道那個goroutine會在channel接受數據,編譯器無法知道什么時候釋放。
2.在一個切片上存儲指針或帶指針的值。比如[]*string,導致切片內容逃逸,其引用值一直在堆上。
3.切片的append導致超出容量,切片重新分配地址,切片背后的存儲基于運行時的數據進行擴充,就會在堆上分配。
4.調用接口類型時,接口類型的方法調用是動態調度,實際使用的具體實現只能在運行時確定,如一個接口類型為io.Reader的變量r,對r.Read(b)的調用將導致r的值和字節片b的后續轉義并因此分配到堆上。
5.在方法內把局部變量指針返回,被外部引用,其生命周期大于棧,導致內存溢出。