Golang语言社区GoGolang 入门资料+笔记

Golang内存分配逃逸分析

2021-04-01  本文已影响0人  五岁小孩

参考博客

问题

关于堆和栈

逃逸场景(什么情况才分配到堆中)

指针逃逸:在方法内把局部变量指针返回

栈空间不足逃逸(空间开辟过大)

动态类型逃逸(不确定长度大小)(在 interface 类型上调用方法)

闭包引用对象逃逸

发送指针或带有指针的值到 channel 中

在一个切片上存储指针或带指针的值

slice 的背后数组被重新分配了,因为 append 时可能会超出其容量( cap )

逃逸分析(Escape analysis)

所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。

通过 `go build -gcflags=-m main.go` 查看逃逸的情况
go build -gcflags=-m main.go
# command-line-arguments
./main.go:7:6: can inline foo
./main.go:13:10: inlining call to foo
./main.go:7:10: leaking param: s
./main.go:8:10: new(A) escapes to heap   # 发生逃逸
./main.go:16:13: io.Writer(os.Stdout) escapes to heap
./main.go:16:13: c escapes to heap      # 发生逃逸
上一篇 下一篇

猜你喜欢

热点阅读