新聞中心
1.介紹
熟悉 C / C++ 的讀者朋友們應(yīng)該都知道一個(gè)進(jìn)程(應(yīng)用程序)的虛擬內(nèi)存空間劃分為棧內(nèi)存區(qū)和堆內(nèi)存區(qū)。

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、石嘴山ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的石嘴山網(wǎng)站制作公司
棧內(nèi)存區(qū)上對(duì)象的內(nèi)存空間是自動(dòng)分配和銷毀的,使用者無(wú)需關(guān)心。但是,堆內(nèi)存區(qū)上對(duì)象的內(nèi)存空間是需要使用者自己管理,無(wú)形中增加了使用者的心智負(fù)擔(dān)。
因此,一些高級(jí)語(yǔ)言會(huì)支持垃圾回收(GC),降低使用者內(nèi)存管理的心智負(fù)擔(dān)。支持垃圾回收的語(yǔ)言可以自動(dòng)管理堆內(nèi)存區(qū)上對(duì)象的內(nèi)存空間。
Go 語(yǔ)言編譯器負(fù)責(zé)決定把對(duì)象分配到棧上或堆上,比如一個(gè)對(duì)象在函數(shù)退出后就不可達(dá)(沒(méi)有其他對(duì)象引用該對(duì)象)時(shí),那就將該對(duì)象分配到棧上,反之,則分配到堆上。
如果一個(gè)對(duì)象被分配到堆上,就需要 Go 的垃圾回收管理該對(duì)象的內(nèi)存空間。但是,垃圾回收是有代價(jià)的,它會(huì)占用系統(tǒng)開(kāi)銷。
所以,為了更大限度地降低垃圾回收占用的系統(tǒng)資源,提升應(yīng)用程序本身可使用的系統(tǒng)資源,使用者就需要盡量減少堆內(nèi)存分配,盡量多地使應(yīng)用程序使用棧內(nèi)存分配,盡量避免 Go 編譯器通過(guò)逃逸分析優(yōu)化后被分配到棧內(nèi)存的對(duì)象逃逸到堆內(nèi)存。
2.查看對(duì)象是否發(fā)生逃逸
Go 語(yǔ)言工具鏈提供了查看對(duì)象是否逃逸的方法,我們?cè)趫?zhí)行 go build 時(shí),配合使用參數(shù) -gcflags 開(kāi)啟編譯器支持的額外功能,例如:
go build -gcflasg '-m -m -l' main.go
- -m 用于輸出編譯器的執(zhí)行細(xì)節(jié),包括逃逸分析的執(zhí)行。
- -l 用于禁用內(nèi)聯(lián)優(yōu)化。
我們通過(guò)使用 Go 語(yǔ)言工具鏈對(duì)一段簡(jiǎn)單的示例代碼進(jìn)行查看對(duì)象是否發(fā)生逃逸。
func main() {
sum(1, 2)
}
func sum(a, b int) *int {
res := a + b
return &res
}輸出結(jié)果:
go build -gcflags '-m -m -l' main.go
# command-line-arguments
./main.go:8:2: res escapes to heap:
./main.go:8:2: flow: ~r0 = &res:
./main.go:8:2: from &res (address-of) at ./main.go:9:9
./main.go:8:2: from return &res (return) at ./main.go:9:2
./main.go:8:2: moved to heap: res
閱讀上面這段代碼,我們發(fā)現(xiàn) sum 函數(shù)中的變量 res 逃逸到堆,也就是說(shuō) Go 編譯器通過(guò)逃逸分析,決定將變量 res 分配到堆空間。
3.逃逸分析的作用
Go 語(yǔ)言編譯器通過(guò)逃逸分析優(yōu)化,將對(duì)象合理分配到棧空間和堆空間。
因?yàn)闂?nèi)存分配比堆內(nèi)存分配更快,所以 Go 語(yǔ)言在編譯時(shí)通過(guò)逃逸分析優(yōu)化將不會(huì)發(fā)生逃逸的對(duì)象優(yōu)先分配到棧空間。
因此,不僅降低堆空間內(nèi)存分配的開(kāi)銷,同時(shí),也可以降低垃圾回收占用的系統(tǒng)資源。
4.總結(jié)
本文我們介紹 Go 語(yǔ)言逃逸分析,它可以幫助使用者合理分配對(duì)象的內(nèi)存空間。
我們知道分配到堆內(nèi)存空間的對(duì)象,會(huì)導(dǎo)致 Go 執(zhí)行垃圾回收,而垃圾回收會(huì)占用系統(tǒng)資源,降低應(yīng)用程序本身可使用的系統(tǒng)資源。
所以,我們?cè)趯?shí)際項(xiàng)目開(kāi)發(fā)中,可以借助 Go 工具鏈分析對(duì)象是否會(huì)發(fā)生逃逸,盡量避免一些不必要的對(duì)象逃逸。
網(wǎng)頁(yè)題目:讓我們一起分析Go語(yǔ)言逃逸
標(biāo)題網(wǎng)址:http://fisionsoft.com.cn/article/cccgjgh.html


咨詢
建站咨詢
