一文搞懂Golang中的內(nèi)存逃逸_第1頁
一文搞懂Golang中的內(nèi)存逃逸_第2頁
一文搞懂Golang中的內(nèi)存逃逸_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一文搞懂Golang中的內(nèi)存逃逸

什么是內(nèi)存逃逸

在了解什么是內(nèi)存逃逸之前,我們先來了解兩個(gè)概念,棧內(nèi)存和堆內(nèi)存。

堆內(nèi)存(Heap):一般來講是人為手動(dòng)進(jìn)行管理,手動(dòng)申請(qǐng)、分配、釋放。一般硬件內(nèi)存有多大堆內(nèi)存就有多大。適合不可預(yù)知大小的內(nèi)存分配,分配速度較慢,而且會(huì)形成內(nèi)存碎片。

棧內(nèi)存(Stack):是一種擁有特殊規(guī)則的線性表數(shù)據(jù)結(jié)構(gòu)。由編譯器進(jìn)行管理,自動(dòng)申請(qǐng)、分配、釋放。大小一般是固定的。

通過上面我們可以看出堆分配昂貴,棧分配廉價(jià),在go中所有內(nèi)存優(yōu)先棧分配,那么,Go編譯器怎么知道某個(gè)變量需要分配在棧上,還是堆上呢?

逃逸分析是用于堆和棧分配進(jìn)行選擇,通過在編譯時(shí)期做gc,編譯器追蹤變量在代碼塊的作用域,判斷變量在整個(gè)運(yùn)行周期是否在運(yùn)行時(shí)完全可知,通過校驗(yàn)可以在棧上分配;否則逃逸到堆上;逃逸分析由編譯器完成,作用于編譯階段。

查看對(duì)象是否發(fā)生逃逸

Go語言工具鏈提供了查看對(duì)象是否逃逸的方法,我們?cè)趫?zhí)行g(shù)obuild時(shí),配合使用參數(shù)-gcflags開啟編譯器支持的額外功能,例如:

gobuild-gcflags'-m-l'main.go

-m會(huì)打印出逃逸分析的優(yōu)化策略,實(shí)際上最多總共可以用4個(gè)-m,但是信息量較大,一般用1個(gè)就可以了

-l會(huì)禁用函數(shù)內(nèi)聯(lián),在這里禁用掉inline能更好的觀察逃逸情況,減少干擾。

除了使用編譯參數(shù)之外,我們還可以使用一種更底層的,更硬核,也更準(zhǔn)確的方式來判斷一個(gè)對(duì)象是否逃逸,那就是:通過反編譯命令查看

gotoolcompile-Smain.go

示例:

funcmain(){

sum(1,2)

funcsum(a,bint)*int{

res:=a+b

returnres

結(jié)果如下,第7行變量res逃逸到了堆上

內(nèi)存逃逸分析的意義

通過逃逸分析,可以盡量把那些不需要分配到堆上的變量直接分配到棧上,堆上的變量少了,會(huì)減輕分配堆內(nèi)存的開銷,同時(shí)也會(huì)減少GC的壓力,提高程序的運(yùn)行速度。

怎么避免內(nèi)存逃逸

盡量減少外部指針引用,必要的時(shí)候可以使用值傳遞;

對(duì)于自己定義的數(shù)據(jù)大小,有一個(gè)基本的預(yù)判,盡量不要出現(xiàn)??臻g溢出的情況;

Golang中的接口類型的方法調(diào)用是動(dòng)態(tài)調(diào)度,如果對(duì)于性能要求比較高且訪問頻次比較高的函數(shù)調(diào)用,應(yīng)該盡量避免使用接口類型;

盡量不要寫閉包函數(shù),可讀性差且發(fā)生逃逸。

小結(jié)

本文主要介紹了Go語言逃逸分析,它可以幫助我們合理分配對(duì)象的內(nèi)存空間。

我們知道分配到堆內(nèi)存空間的對(duì)象,會(huì)導(dǎo)致Go執(zhí)行垃圾回收,而垃圾回收會(huì)占用系統(tǒng)資源,降低應(yīng)用程序本身可使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論