概念:从栈上逃逸到堆上的现象称为内存逃逸
逃逸机制
1. 如果函数外部没有引用,则优先放到栈中
2. 如果函数外部存在引用,则必定放到堆中
3. 如果栈上放不下,则必定放到堆上
通过编译参数-gcflag=-m可以查看编译过程中的逃逸分析
内存逃逸场景
1. 函数返回值为局部变量的指针,函数虽然退出了,但是因为指针的存在,指向的内存不能随着函数结束而回收,因此只能分配在堆上
2. 栈空间不足
3. 变量大小不确定
编译期间无法确定slice的长度,这种情况是为了保证内存的安全,编译器也会触发逃逸,在堆上分配内存。
4. 动态类型
动态类型就是在编译期间不能确定参数的类型,参数的长度也不确定的情况下会发生逃逸,如:空接口interface{}可以表示任意的类型,函数参数为interface{}会发生逃逸
5. 闭包引用对象