下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年食品安全與衛(wèi)生管理考試題集及答案
- 2026年?duì)I銷策略實(shí)戰(zhàn)題庫市場定位與消費(fèi)者行為研究
- 2026年中醫(yī)藥學(xué)基礎(chǔ)理論與應(yīng)用初級(jí)試題
- 2026年計(jì)算機(jī)網(wǎng)絡(luò)安全專業(yè)試題庫認(rèn)證題庫及答案解析
- 2026年人工智能技術(shù)與應(yīng)用考試政務(wù)云平臺(tái)的AI技術(shù)探索
- 2026年軟件測試工程師實(shí)操技巧與答案解析
- 2025 小學(xué)二年級(jí)道德與法治上冊(cè)家庭綠植我按時(shí)澆水養(yǎng)護(hù)促成長更翠綠課件
- 2026年高頻面試問題專業(yè)答案與解析集
- 2026年化學(xué)實(shí)驗(yàn)技能操作模擬題
- 2026年金融分析師考試技巧投資策略模擬題集
- 高校行政人員筆試試題(附答案)
- 2025年農(nóng)村會(huì)計(jì)考試試題題庫及答案
- 檢驗(yàn)科電解質(zhì)教學(xué)課件
- 浙江省杭州市西湖區(qū)杭州學(xué)軍中學(xué)2025-2026學(xué)年物理高二上期末質(zhì)量跟蹤監(jiān)視試題含解析
- 創(chuàng)傷病人的評(píng)估和護(hù)理
- 房建工程施工工藝流程
- 設(shè)備委托開發(fā)合同(標(biāo)準(zhǔn)版)
- 理解人際溝通中的情緒管理和表達(dá)技巧應(yīng)用
- 2025 年四年級(jí)語文閱讀理解(分析人物形象)突破卷
- 手術(shù)室三方核查規(guī)范
- 2025年黑龍江省大慶市中考數(shù)學(xué)試題【含答案、解析】
評(píng)論
0/150
提交評(píng)論