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

Go 語(yǔ)言內(nèi)存逃逸案例

開發(fā)
在「Go 語(yǔ)言逃逸分析」中,我們了解到內(nèi)存分配的相關(guān)知識(shí),棧空間分配開銷小,堆空間分配開銷大。

01 介紹

在「Go 語(yǔ)言逃逸分析」中,我們了解到內(nèi)存分配的相關(guān)知識(shí),棧空間分配開銷小,堆空間分配開銷大。

Go 語(yǔ)言編譯器可以通過(guò)逃逸分析決定內(nèi)存分配到棧空間或堆空間。但是,分配到棧空間的對(duì)象在某些情況中會(huì)逃逸到堆空間。我們可以使用 Go 工具鏈查看對(duì)象是否發(fā)生內(nèi)存逃逸。

為了提升 Go 應(yīng)用程序的性能,我們應(yīng)該避免 Go 應(yīng)用程序中出現(xiàn)內(nèi)存逃逸的現(xiàn)象,本文我們介紹 Go 語(yǔ)言內(nèi)存逃逸的幾種典型案例。

02 內(nèi)存逃逸案例

指針逃逸

示例代碼:

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

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

輸出結(jié)果:

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

閱讀上面這段代碼,我們創(chuàng)建一個(gè)函數(shù) pointerEscape?,函數(shù)內(nèi)部創(chuàng)建一個(gè)局部變量 sum,返回結(jié)果是該變量的指針。

通過(guò)執(zhí)行 go build --gcflags '-m -m -l' main.go 的輸出結(jié)果,我們發(fā)現(xiàn)函數(shù)中定義的局部變量 sum 逃逸到堆空間,這就是所謂的指針逃逸。

函數(shù) pointerEscape? 的局部變量 sum? 本來(lái)應(yīng)該在函數(shù)結(jié)束時(shí)被回收,但是在 main 函數(shù)中會(huì)繼續(xù)使用 sum? 變量的內(nèi)存地址,導(dǎo)致變量 sum 被逃逸到堆上。

如果想要避免示例函數(shù)的返回結(jié)果出現(xiàn)內(nèi)存逃逸,可以使用值類型的返回結(jié)果,這樣就帶來(lái)另外一個(gè)問(wèn)題。

如果返回結(jié)果是一個(gè)比較大的變量,比如返回結(jié)果是較大的結(jié)構(gòu)體類型的變量,我們使用值類型將會(huì)造成比較大的內(nèi)存占用。

所以,我們?cè)趯?shí)際項(xiàng)目開發(fā)中,需要根據(jù)實(shí)際情況,合理使用返回結(jié)果的類型。

動(dòng)態(tài)類型逃逸

示例代碼:

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

輸出結(jié)果:

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

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

通過(guò)執(zhí)行 go run -gcflags '-m -m -l' main.go? 的輸出結(jié)果,我們發(fā)現(xiàn)使用 fmt.Println()? 打印的字符串 hello world 逃逸到堆上,這就是所謂的動(dòng)態(tài)類型逃逸。

因?yàn)?nbsp;fmt.Println() 接收的參數(shù)是空接口類型,Go 編譯器無(wú)法確定入?yún)⒆兞康木唧w類型,所以此類情況變量也會(huì)逃逸到堆上。

03 總結(jié)

本文我們介紹兩個(gè)典型的內(nèi)存逃逸的案例,除此之外,以下幾種情況,也會(huì)發(fā)生內(nèi)存逃逸。

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

感興趣的讀者朋友們,可以自行編寫上述幾種情況的示例代碼,驗(yàn)證是否會(huì)發(fā)生內(nèi)存逃逸。

責(zé)任編輯:未麗燕 來(lái)源: Golang語(yǔ)言開發(fā)棧
相關(guān)推薦

2021-05-30 19:29:12

內(nèi)存Go語(yǔ)言

2024-04-07 11:33:02

Go逃逸分析

2023-01-10 09:18:37

Go內(nèi)存分配逃逸

2023-01-28 08:32:04

Go內(nèi)存分配

2022-07-10 23:15:46

Go語(yǔ)言內(nèi)存

2022-11-30 08:19:15

內(nèi)存分配Go逃逸分析

2017-03-17 09:31:40

2021-01-06 09:47:51

內(nèi)存Go語(yǔ)言

2023-11-21 15:46:13

Go內(nèi)存泄漏

2017-10-23 14:08:37

2018-03-12 22:13:46

GO語(yǔ)言編程軟件

2022-11-08 11:26:13

Go逃逸代碼

2014-01-14 09:10:53

GoHTTP內(nèi)存泄漏

2023-12-22 07:55:38

Go語(yǔ)言分配策略

2021-08-02 07:57:02

內(nèi)存Go語(yǔ)言

2012-10-08 09:25:59

GoGo語(yǔ)言開發(fā)語(yǔ)言

2022-10-10 11:37:14

Gomap內(nèi)存

2020-07-21 14:19:18

JVM編程語(yǔ)言

2022-05-13 23:46:52

GO編程內(nèi)存

2022-03-13 23:51:39

Web項(xiàng)目Go
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩国产一区二区 | 国产精品久久久久久久久久久久 | 国产美女自拍视频 | 免费看黄视频网站 | 国产在线播放一区二区三区 | 国产精品二区三区 | 国产精品一区二区无线 | 一区二区av| 黄视频网站免费观看 | 欧美午夜一区 | 在线日韩中文字幕 | 亚洲欧美国产精品一区二区 | 久久久久国产精品一区三寸 | 一区二区三区四区在线视频 | 丝袜美腿一区二区三区 | 色婷婷综合网 | 久久国内精品 | 中文字幕日韩av | 国产美女福利在线观看 | 午夜av免费 | 国产亚洲一区二区三区 | www.国产日本| 亚洲最大福利网 | 成人av一区 | 国产成人99久久亚洲综合精品 | 福利网址 | 国产成人精品区一区二区不卡 | 一区二区三区四区不卡视频 | 91高清视频在线 | 91久久精品 | 嫩草影院网址 | 成人黄色在线观看 | 日韩高清www | 欧美日韩国产中文 | 一级毛片在线视频 | 男女羞羞视频在线免费观看 | 日本不卡一区二区三区 | 午夜影院黄 | 91久久 | 男女羞羞免费视频 | 中文字幕一区二区三区精彩视频 |