欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年09月08日 14:08:40   作者:1個(gè)俗人  
我們都知道go語(yǔ)言中內(nèi)存管理工作都是由Go在底層完成的,這樣我們可以不用過(guò)多的關(guān)注底層的內(nèi)存問(wèn)題。本文主要總結(jié)一下?Golang內(nèi)存逃逸分析,需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助

前言

我們都知道go語(yǔ)言中內(nèi)存管理工作都是由Go在底層完成的,這樣我們可以不用過(guò)多的關(guān)注底層的內(nèi)存問(wèn)題,有更多的精力去關(guān)注業(yè)務(wù)邏輯, 但掌握內(nèi)存的管理,理解內(nèi)存分配機(jī)制,可以讓你寫(xiě)出更高效的代碼,本文主要總結(jié)一下 Golang內(nèi)存逃逸分析,需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助。

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

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

堆內(nèi)存(Heap):一般來(lái)講是人為手動(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)、分配、釋放。大小一般是固定的。

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

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

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

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

go build -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)確的方式來(lái)判斷一個(gè)對(duì)象是否逃逸,那就是: 通過(guò)反編譯命令查看

go tool compile -S main.go

示例:

func main()  {
	sum(1, 2)
}
func sum(a, b int) *int {
	res := a + b
	return &res
}

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

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

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

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

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

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

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

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

小結(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ì)象逃逸。

到此這篇關(guān)于一文搞懂Golang中的內(nèi)存逃逸的文章就介紹到這了,更多相關(guān)Go內(nèi)存逃逸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié)

    Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié)

    本文主要介紹了Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié),詳細(xì)解析了通道的類(lèi)型、操作方法以及垃圾回收機(jī)制,從基礎(chǔ)概念到高級(jí)應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Go語(yǔ)言調(diào)用DeepSeek?API實(shí)現(xiàn)流式輸出和對(duì)話

    Go語(yǔ)言調(diào)用DeepSeek?API實(shí)現(xiàn)流式輸出和對(duì)話

    DeepSeek是一個(gè)強(qiáng)大的AI模型服務(wù)平臺(tái),本文將詳細(xì)介紹如何使用Go語(yǔ)言調(diào)用DeepSeek?API實(shí)現(xiàn)流式輸出和對(duì)話功能,感興趣的小伙伴可以了解一下
    2025-02-02
  • 深入理解Go設(shè)計(jì)模式之代理模式

    深入理解Go設(shè)計(jì)模式之代理模式

    代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,?其中代理控制著對(duì)于原對(duì)象的訪問(wèn),?并允許在將請(qǐng)求提交給原對(duì)象的前后進(jìn)行一些處理,從而增強(qiáng)原對(duì)象的邏輯處理,這篇文章主要來(lái)學(xué)習(xí)一下代理模式的構(gòu)成和用法,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例

    Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例

    本文主要介紹了Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語(yǔ)言怎么使用變長(zhǎng)參數(shù)函數(shù)

    Go語(yǔ)言怎么使用變長(zhǎng)參數(shù)函數(shù)

    本文主要介紹了Go語(yǔ)言怎么使用變長(zhǎng)參數(shù)函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • go語(yǔ)言面試如何實(shí)現(xiàn)自旋鎖?

    go語(yǔ)言面試如何實(shí)現(xiàn)自旋鎖?

    這篇文章主要為大家介紹了go語(yǔ)言面試中常問(wèn)的如何實(shí)現(xiàn)自旋鎖問(wèn)題實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • golang?debug調(diào)試的實(shí)現(xiàn)

    golang?debug調(diào)試的實(shí)現(xiàn)

    本文主要介紹了使用Go語(yǔ)言進(jìn)行本地調(diào)試和遠(yuǎn)程調(diào)試,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • golang高并發(fā)的深入理解

    golang高并發(fā)的深入理解

    golang從語(yǔ)言級(jí)別上對(duì)并發(fā)提供了支持,而且在啟動(dòng)并發(fā)的方式上直接添加了語(yǔ)言級(jí)的關(guān)鍵字。下面這篇文章主要給大家介紹了關(guān)于golang高并發(fā)的相關(guān)資料,需要的朋友可以參考下
    2019-03-03
  • golang gin ShouldBind的介紹和使用示例詳解

    golang gin ShouldBind的介紹和使用示例詳解

    在 Go 語(yǔ)言的 Gin 框架中,ShouldBind 是用于將請(qǐng)求中的數(shù)據(jù)綁定到結(jié)構(gòu)體的一個(gè)方法,它簡(jiǎn)化了從請(qǐng)求中提取參數(shù)的過(guò)程,支持多種數(shù)據(jù)格式,下面給大家分享golang gin ShouldBind的介紹和使用示例,感興趣的朋友一起看看吧
    2024-10-10
  • Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go語(yǔ)言團(tuán)隊(duì)的一個(gè)核心目標(biāo)是保持語(yǔ)言的簡(jiǎn)單性,他們認(rèn)為,如果一個(gè)功能可以用簡(jiǎn)單的組合來(lái)實(shí)現(xiàn),那就沒(méi)有必要把它放進(jìn)標(biāo)準(zhǔn)庫(kù)里,本文給大家介紹Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評(píng)論