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

golang內(nèi)存逃逸的學(xué)習(xí)筆記

 更新時間:2024年05月05日 09:03:07   作者:淡墨@~無痕  
內(nèi)存逃逸是 Go 語言編程中一個特別需要注意的問題,會影響到程序的性能和穩(wěn)定性,本文主要介紹了golang內(nèi)存逃逸的學(xué)習(xí)筆記,感興趣的可以了解一下

逃逸分析( Escape analysis) 是指由編譯器決定內(nèi)存分配的位置, 不需要程序員指定。 函數(shù)中申請一個新的對象。

  • 如果分配在棧中, 則函數(shù)執(zhí)行結(jié)束可自動將內(nèi)存回收;
  • 如果分配在堆中, 則函數(shù)執(zhí)行結(jié)束可交給GC( 垃圾回收) 處理;

內(nèi)存逃逸策略

每當(dāng)函數(shù)中申請新的對象, 編譯器會跟據(jù)該對象是否被函數(shù)外部引用來決定是否逃逸:

  • 如果函數(shù)外部沒有引用, 則優(yōu)先放到棧中
  • 如果函數(shù)外部存在引用, 則必定放到堆中;

注意, 對于函數(shù)外部沒有引用的對象, 也有可能放到堆中, 比如內(nèi)存過大超過棧的存儲能力。

逃逸場景分析

指針逃逸

Go可以返回局部變量指針, 這其實是一個典型的變量逃逸案例, 示例代碼如下:

package main

type Student struct {
	Name string
	age int
}

func NewStudent(name string, age int) *Student {
	stu := new(Student)
	stu.Name = name
	stu.age = age
	return stu
}
func main()  {
	NewStudent("abcd", 24)
}

函數(shù)NewStudent()內(nèi)部stu為局部變量, 其值通過函數(shù)返回值返回, stu本身為一指針, 其指向的內(nèi)存地址不會是棧而是堆, 這就是典型的逃逸案例。

通過編譯參數(shù)-gcflags=-m可以查年編譯過程中的逃逸分析:
運行結(jié)果: 請注意運行結(jié)果中出現(xiàn)了escapes to heap,也就是發(fā)生了內(nèi)存逃逸現(xiàn)象。

在這里插入圖片描述

??臻g不足逃逸

分析一下下面代碼會不會產(chǎn)生內(nèi)存逃逸現(xiàn)象

package main

type Student struct {
	Name string
	age int
}

func Slice()  {
	s := make([]int, 1000, 1000)
	for index, _ := range s {
		s[index] = index
	}
}
func main()  {
	Slice()
}

上面代碼Slice()函數(shù)中分配了一個1000個長度的切片, 是否逃逸取決于??臻g是否足夠大。 直接查看編譯提示, 如下可見并沒有發(fā)生逃逸:

在這里插入圖片描述

但是如果長度擴大10倍呢?那情況會怎么樣?

package main

func Slice()  {
	s := make([]int, 10000, 10000)
	for index, _ := range s {
		s[index] = index
	}
}
func main()  {
	Slice()
}

結(jié)果:

在這里插入圖片描述

我們發(fā)現(xiàn)當(dāng)切片長度擴大到10000時就會逃逸。實際上當(dāng)??臻g不足以存放當(dāng)前對象時或無法判斷當(dāng)前切片長度時會將對象分配到堆中

動態(tài)類型逃逸

很多函數(shù)參數(shù)為interface類型, 比如fmt.Println(a …interface{}), 編譯期間很難確定其參數(shù)的具體類型,也人產(chǎn)生逃逸。 如下代碼所示:

package main

import "fmt"

func main()  {
	s := "abcd"
	fmt.Println(s)
}

結(jié)果:上述代碼s變量只是一個string類型變量, 調(diào)用fmt.Println()時會產(chǎn)生逃逸。

在這里插入圖片描述

閉包引用對象逃逸

相信刷題的同學(xué)對這代碼是十分的熟悉:

package main

import "fmt"

func Fibonacci() func() int {
	a, b := 0, 1
	return func() int {
		a, b = b, a + b
		return a
	}
}
func main()  {
	res := Fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Printf("Print Result is %d\n" , res())
	}
}

這段代碼的運行結(jié)果如下:

在這里插入圖片描述

但是Fibonacci()函數(shù)中原本屬于局部變量的a和b由于閉包的引用, 不得不將二者放到堆上, 以致產(chǎn)生逃逸:

在這里插入圖片描述

總結(jié)

  • 棧上分配內(nèi)存比在堆中分配內(nèi)存有更高的效率
  • 棧上分配的內(nèi)存不需要GC處理
  • 堆上分配的內(nèi)存使用完畢會交給GC處理
  • 逃逸分析目的是決定內(nèi)分配地址是棧還是堆
  • 逃逸分析在編譯階段完成

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

相關(guān)文章

  • 一文帶你探索Go語言中的函數(shù)一等公民

    一文帶你探索Go語言中的函數(shù)一等公民

    你是否聽說過?Go?語言中的函數(shù)是一等公民,如果沒有,那么恭喜你,本文將帶你一起揭開這個神秘的面紗,感興趣的小伙伴快來和小編一起學(xué)習(xí)起來吧
    2023-07-07
  • 在Go語言程序中使用gojson來解析JSON格式文件

    在Go語言程序中使用gojson來解析JSON格式文件

    這篇文章主要介紹了在Go語言程序中使用gojson來解析JSON格式文件的方法,Go是由Google開發(fā)的高人氣新興編程語言,需要的朋友可以參考下
    2015-10-10
  • Go中的nil切片和空切片區(qū)別詳解

    Go中的nil切片和空切片區(qū)別詳解

    這篇文章主要介紹了Go中的nil切片和空切片區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用Go語言進行安卓開發(fā)的詳細教程

    使用Go語言進行安卓開發(fā)的詳細教程

    本文將介紹如何使用Go語言進行安卓開發(fā),我們將探討使用Go語言進行安卓開發(fā)的優(yōu)點、準(zhǔn)備工作、基本概念和示例代碼,通過本文的學(xué)習(xí),你將了解如何使用Go語言構(gòu)建高效的安卓應(yīng)用程序,需要的朋友可以參考下
    2023-11-11
  • Go中的go.mod使用詳解

    Go中的go.mod使用詳解

    這篇文章主要介紹了Go中的go.mod使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Go 語言中程序編譯過程詳解

    Go 語言中程序編譯過程詳解

    本文旨在深入探討Go語言的編譯機制和最新的模塊管理系統(tǒng)——Go Modules,通過詳細的示例和步驟,我們將演示從簡單的 “Hello World” 程序到使用第三方庫的更復(fù)雜項目的開發(fā)過程,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Go?container包的介紹

    Go?container包的介紹

    這篇文章主要介紹了Go?container包,go語言container包中有List和Element容器ist和Element都是結(jié)構(gòu)體類型。結(jié)構(gòu)體類型有一個特點,那就是它們的零值都會是擁有其特定結(jié)構(gòu),但沒有任何定制化內(nèi)容的值,相當(dāng)于一個空殼,下面一起進文章來了解具體內(nèi)容吧
    2021-12-12
  • Go?語言使用goroutine運行閉包踩坑分析

    Go?語言使用goroutine運行閉包踩坑分析

    這篇文章主要介紹了Go?語言使用goroutine運行閉包踩坑解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • golang通過mysql語句實現(xiàn)分頁查詢

    golang通過mysql語句實現(xiàn)分頁查詢

    這篇文章主要介紹了golang通過mysql語句實現(xiàn)分頁查詢,文章內(nèi)容介紹詳細,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • Go語言基礎(chǔ)教程之函數(shù)和方法詳解

    Go語言基礎(chǔ)教程之函數(shù)和方法詳解

    在Go語言中,函數(shù)和方法在聲明方式上存在顯著差異,理解這一點是正確解讀文檔的關(guān)鍵,這篇文章主要介紹了Go語言基礎(chǔ)教程之函數(shù)和方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-10-10

最新評論