翻译自:http://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html
Golang 逃逸剖析
2015-10-18
垃圾回收是 Go 的一个很便当的个性 – 其主动的内存治理使代码更整洁,同时缩小内存透露的可能性。然而,因为垃圾回收须要周期性的进行程序从而去收集不必的对象,不可避免的会减少额定开销。Go 编译器是智能的,它会主动决定一个变量是应该调配在堆上从而在未来便于回收,还是间接调配到函数的栈空间。对于调配到栈上的变量,其与调配到堆上的变量不同之处在于:随着函数的返回,栈空间会被销毁,从而栈上的变量被间接销毁,不须要额定的垃圾回收开销。
Go 的逃逸剖析绝对于 Java 虚拟机的 HotSpot 来说更为根底。根本规定就是,如果一个变量的援用从申明它的函数中返回了,则产生“逃逸”,因为它有可能在函数外被别的内容应用,所以必须调配到堆上。如下几种状况会比较复杂:
- 函数调用其余函数
- 援用作为构造体的成员变量
- 切片和映射
- Cgo 指向变量的指针
为了实现逃逸剖析,Go 会在编译阶段结构函数调用关系图,同时跟踪入参和返回值的流程。
— 待持续