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

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

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

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

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)存逃逸分析的意義

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

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

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

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

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

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

小結(jié)

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

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

所以,我們在實際項目開發(fā)中,可以借助 Go 工具鏈分析對象是否會發(fā)生逃逸,盡量避免一些不必要的對象逃逸。

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

相關(guān)文章

  • go使用支付寶沙箱實現(xiàn)支付寶支付的操作步驟

    go使用支付寶沙箱實現(xiàn)支付寶支付的操作步驟

    支付寶沙箱支付是支付寶提供的一個測試環(huán)境,用于開發(fā)者在不影響真實交易的情況下進(jìn)行支付接口的開發(fā)和調(diào)試,本文給大家介紹了go使用支付寶沙箱實現(xiàn)支付寶支付的操作步驟,文中有詳細(xì)的代碼示例和圖文供大家參考,需要的朋友可以參考下
    2024-03-03
  • Go中strings包的基本使用示例代碼

    Go中strings包的基本使用示例代碼

    本文詳細(xì)介紹了Go語言中strings包的基本使用方法,包括字符串的前綴、后綴判斷,字符串包含、索引查找、字符串替換、計數(shù)、重復(fù)、大小寫轉(zhuǎn)換、修剪、分割、拼接以及數(shù)據(jù)類型轉(zhuǎn)換等功能,示例代碼豐富,適合初學(xué)者和需要使用字符串處理功能的開發(fā)者參考學(xué)習(xí)
    2024-10-10
  • Go語言WaitGroup使用時需要注意的坑

    Go語言WaitGroup使用時需要注意的坑

    Go語言中WaitGroup的用途是它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。之前一直使用也沒有問題,但最近通過同事的一段代碼引起了關(guān)于WaitGroup的注意,下面這篇文章就介紹了WaitGroup使用時需要注意的坑及填坑。
    2016-12-12
  • Golang Type關(guān)鍵字的使用

    Golang Type關(guān)鍵字的使用

    Type關(guān)鍵字在Go語言中作用很重要,比如定義結(jié)構(gòu)體,接口,還可以自定義類型,定義類型別名等,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Go語言底層原理互斥鎖的實現(xiàn)原理

    Go語言底層原理互斥鎖的實現(xiàn)原理

    這篇文章主要介紹了Go語言底層原理互斥鎖的實現(xiàn)原理,Go?sync包提供了兩種鎖類型,分別是互斥鎖sync.Mutex和讀寫互斥鎖sync.RWMutex,都屬于悲觀鎖,更多相關(guān)內(nèi)容需要的朋友可以查看下面文章內(nèi)容
    2022-08-08
  • Go語言:打造優(yōu)雅數(shù)據(jù)庫單元測試的實戰(zhàn)指南

    Go語言:打造優(yōu)雅數(shù)據(jù)庫單元測試的實戰(zhàn)指南

    Go語言數(shù)據(jù)庫單元測試入門:聚焦高效、可靠的數(shù)據(jù)庫代碼驗證!想要確保您的Go應(yīng)用數(shù)據(jù)層堅如磐石嗎?本指南將手把手教您如何利用Go進(jìn)行數(shù)據(jù)庫單元測試,輕松揪出隱藏的bug,打造無懈可擊的數(shù)據(jù)處理邏輯,一起來探索吧!
    2024-01-01
  • 深度解析Go語言中的未使用導(dǎo)入和變量

    深度解析Go語言中的未使用導(dǎo)入和變量

    本文解析Go語言中未使用導(dǎo)入和變量的處理機(jī)制,強調(diào)其強制使用規(guī)則對代碼質(zhì)量的保障,通過移除冗余、使用空白標(biāo)識符及工具清理,可提升代碼可讀性與性能
    2025-06-06
  • Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用

    Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用

    這篇文章主要為大家介紹了Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 深入解析Go?變量字符串與字符編碼問題

    深入解析Go?變量字符串與字符編碼問題

    Go的字符串是由單個字節(jié)連接起來的,Go語言的字符串的字節(jié)使用UTF-8編碼標(biāo)識Unicode文本,接下來通過本文給大家介紹下Go變量字符串與字符編碼問題,需要的朋友可以參考下
    2022-04-04
  • go操作Kafka使用示例詳解

    go操作Kafka使用示例詳解

    這篇文章主要為大家介紹了go操作Kafka使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論