我的博客搬家啦~欢迎光临:今天没吃橘子。 月一orange - 博客园
逃逸分析
我们知道往往声明一个变量或者申请内存空间时,是需要区分内存区域的,有的可以申请栈空间,有的申请堆空间。go语言中决定变量是分配到栈还是堆,取决于go编译器对程序的逃逸分析。
在程序编译时,如果发现一个变量需要后续一直使用,往往会将其分配到堆内存。看例子:
func test02() *int {
a := 10
return &a
}
func main() {
test02()
}
a在函数中是个临时变量,理论上运行完函数会直接回收,但是函数将其地址返回,这意味着a可能会在其他时间被使用,那么逃逸分析就决定a要分配在堆内存。
使用go build -gcflags "-m -l" test.go
查看逃逸分析结果:
# command-line-arguments
./test.go:24:2: moved to heap: a
为什么进行逃逸分析
编译器在编译期间尽量减少堆内存的分配,减少堆内存的回收,减少内存碎片的出现,也就尽量减少gc的出现,加快程序速度。
其他例子
关于逃逸分析还有很多情况下会发生,在这里引用这篇文章记录: