成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言內存逃逸案例

開發
在「Go 語言逃逸分析」中,我們了解到內存分配的相關知識,棧空間分配開銷小,堆空間分配開銷大。

01 介紹

在「Go 語言逃逸分析」中,我們了解到內存分配的相關知識,棧空間分配開銷小,堆空間分配開銷大。

Go 語言編譯器可以通過逃逸分析決定內存分配到棧空間或堆空間。但是,分配到棧空間的對象在某些情況中會逃逸到堆空間。我們可以使用 Go 工具鏈查看對象是否發生內存逃逸。

為了提升 Go 應用程序的性能,我們應該避免 Go 應用程序中出現內存逃逸的現象,本文我們介紹 Go 語言內存逃逸的幾種典型案例。

02 內存逃逸案例

指針逃逸

示例代碼:

func main() {
pointerEscape(1, 2)
}

// pointerEscape 指針逃逸
func pointerEscape(a, b int) *int {
sum := a + b
return &sum
}

輸出結果:

go build --gcflags '-m -m -l' main.go
# command-line-arguments
./main.go:9:2: sum escapes to heap:
./main.go:9:2: flow: ~r0 = &sum:
./main.go:9:2: from &sum (address-of) at ./main.go:10:9
./main.go:9:2: from return &sum (return) at ./main.go:10:2
./main.go:9:2: moved to heap: sum

閱讀上面這段代碼,我們創建一個函數 pointerEscape?,函數內部創建一個局部變量 sum,返回結果是該變量的指針。

通過執行 go build --gcflags '-m -m -l' main.go 的輸出結果,我們發現函數中定義的局部變量 sum 逃逸到堆空間,這就是所謂的指針逃逸。

函數 pointerEscape? 的局部變量 sum? 本來應該在函數結束時被回收,但是在 main 函數中會繼續使用 sum? 變量的內存地址,導致變量 sum 被逃逸到堆上。

如果想要避免示例函數的返回結果出現內存逃逸,可以使用值類型的返回結果,這樣就帶來另外一個問題。

如果返回結果是一個比較大的變量,比如返回結果是較大的結構體類型的變量,我們使用值類型將會造成比較大的內存占用。

所以,我們在實際項目開發中,需要根據實際情況,合理使用返回結果的類型。

動態類型逃逸

示例代碼:

func main() {
fmt.Println("hello world")
}

輸出結果:

go run -gcflags '-m -m -l' main.go
# command-line-arguments
./main.go:6:14: "hello world" escapes to heap:
./main.go:6:14: flow: {storage for ... argument} = &{storage for "hello world"}:
./main.go:6:14: from "hello world" (spill) at ./main.go:6:14
./main.go:6:14: from ... argument (slice-literal-element) at ./main.go:6:13
./main.go:6:14: flow: {heap} = {storage for ... argument}:
./main.go:6:14: from ... argument (spill) at ./main.go:6:13
./main.go:6:14: from fmt.Println(... argument...) (call parameter) at ./main.go:6:13
./main.go:6:13: ... argument does not escape
./main.go:6:14: "hello world" escapes to heap

閱讀上面這段代碼,我們在 main 函數中,使用 fmt.Println()? 打印字符串 hello world。

通過執行 go run -gcflags '-m -m -l' main.go? 的輸出結果,我們發現使用 fmt.Println()? 打印的字符串 hello world 逃逸到堆上,這就是所謂的動態類型逃逸。

因為 fmt.Println() 接收的參數是空接口類型,Go 編譯器無法確定入參變量的具體類型,所以此類情況變量也會逃逸到堆上。

03 總結

本文我們介紹兩個典型的內存逃逸的案例,除此之外,以下幾種情況,也會發生內存逃逸。

  • 發送指針或帶有指針的值到 channel 中。
  • 在一個切片上存儲指針或帶指針的值。
  • slice 的底層數組被重新分配(append 超出其容量時)。

感興趣的讀者朋友們,可以自行編寫上述幾種情況的示例代碼,驗證是否會發生內存逃逸。

責任編輯:未麗燕 來源: Golang語言開發棧
相關推薦

2021-05-30 19:29:12

內存Go語言

2024-04-07 11:33:02

Go逃逸分析

2023-01-10 09:18:37

Go內存分配逃逸

2023-01-28 08:32:04

Go內存分配

2022-07-10 23:15:46

Go語言內存

2022-11-30 08:19:15

內存分配Go逃逸分析

2017-03-17 09:31:40

2021-01-06 09:47:51

內存Go語言

2023-11-21 15:46:13

Go內存泄漏

2017-10-23 14:08:37

2018-03-12 22:13:46

GO語言編程軟件

2022-11-08 11:26:13

Go逃逸代碼

2014-01-14 09:10:53

GoHTTP內存泄漏

2023-12-22 07:55:38

Go語言分配策略

2021-08-02 07:57:02

內存Go語言

2012-10-08 09:25:59

GoGo語言開發語言

2022-10-10 11:37:14

Gomap內存

2020-07-21 14:19:18

JVM編程語言

2022-03-13 23:51:39

Web項目Go

2025-05-30 01:55:00

go語言Redis
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 高清一区二区视频 | 成人久久久 | 亚洲天堂av一区 | 久草99| 国产91一区二区三区 | 日日夜夜精品视频 | 国产美女黄色片 | v片网站 | 欧美在线视频观看 | 国产韩国精品一区二区三区 | 91精品久久久久久久99 | 亚洲欧美国产毛片在线 | 在线色网 | 欧美久久一区二区三区 | 日韩精品一区二区三区视频播放 | 91免费电影 | 女人夜夜春 | 一区二区精品 | 成人在线精品视频 | 日韩欧美在线视频 | 亚洲国产成人精品女人久久久 | 中文字幕av亚洲精品一部二部 | 精品国产一区探花在线观看 | 国产精品美女久久久久久久久久久 | 国产aa| 日韩中文一区 | 亚洲精品久久久久久国产精华液 | 狠狠久 | 一区二区三区国产好 | 欧美精品1区2区 | 免费在线国产视频 | 亚洲精品国产成人 | 免费在线黄 | 国产欧美日韩一区二区三区 | 91成人在线 | 欧美黄色录像 | 大乳boobs巨大吃奶挤奶 | 亚洲欧美日韩精品久久亚洲区 | 亚洲国产精品成人久久久 | 国产一区二区三区视频在线观看 | 日韩欧美电影在线 |