什么是逃逸剖析?
把本该调配在栈上的变量调配到了堆,则产生了逃逸。剖析这种状况的行为就是逃逸剖析。

go为变量分配内存的规定:
全局变量,援用类型的调配在堆上,值类型的调配在栈上。
局部变量,个别调配在栈上。如果局部变量太大,则调配在堆上。如果函数执行完,依然有内部援用此局部变量,则调配在堆上。
案例:

var global *intfunc f() {    var x int    x = 1    global = &x}func g() {    y := new(int)    *y = 1}

函数里的x变量必须在堆上调配,因为它在函数f()退出后仍然能够通过包一级的global变量找到,尽管它是在函数外部定义的。

在函数里初始化一个援用类型的变量a := make(map[int]int,10)。其中,变量名a在栈中,其指向的地址在堆空间。
在函数里通过b:=a实现拷贝,这是一个浅拷贝(援用类型的拷贝都是浅拷贝)。栈上新建b,指向a指向的内存地址。



变量空间回收规定:
调配在栈中的变量,在函数执行完结后由零碎将内存回收,是平安的;如果调配在堆中,则函数执行完结由GC(垃圾回收)解决。

插一句:所有的GC都是针对堆的。