参考:Golang内存分配逃逸分析 - jimshi - 博客园
GO语言变量逃逸分析 - Go语言中文网 - Golang中文社区
总结下,就是:
1. 堆和栈
之前写c++的时候,栈是各种局部变量,函数结束就自动释放;堆就是使用new和malloc分配的,需要rd去关注啥时候分配,啥时候释放。在栈上分配内存比较快,而且回收也快,在堆上分配就耗费的资源比较多。而且,在栈上面分配的,函数结束后就自动回收了,只有全局的栈上的变量和堆上的变量,才需要GC回收,减少堆上分配内存的同时,也减轻了gc的压力。
所以go就希望,能尽可能多的在栈上面分配资源。那go是怎么做的呢?
func F() {
temp := make([]int, 0, 20)
...
}
就比如上面这种,虽然是手动执行了make来分配内存,正常来说应该在堆上,但是实际上是在栈上面。但是也不是所有的局部变量都能分配到栈上。
func F() []int{
a := make([]int, 0, 20)
return a
}
比如上面这种,虽然是局部变量,但是因为这个局部变量作为函数返回值返回了,所以也不能分配在栈上,必须分配在堆上。这就是内存逃逸。
2. 检查内存逃逸
指令:
go build -gcflags=-m

本文探讨了Golang中的内存逃逸现象,说明了堆和栈的区别,以及Go语言如何尽量在栈上分配资源。内存逃逸发生在局部变量作为函数返回值、栈空间不足、interface参数、slice和map中指针元素以及闭包等场景。通过编译时分析确定内存分配位置,以减少GC压力。
最低0.47元/天 解锁文章
1210

被折叠的 条评论
为什么被折叠?



