逃逸分析是由编译器决定内存分配的位置,函数中申请一个新的对象
分配在栈中:则函数执行结束可自动将内存回收;
分配在堆中:则函数执行结束可交给GC(垃圾回收)处理;
逃逸分析在编译阶段完成
如何查看编译
通过编译参数-gcflag=-m可以查看编译过程中的逃逸分析
逃逸策略
函数中申请新的对象,编译器会跟据该对象是否被函数外部引用来决定是否逃逸:
1. 如果函数外部没有引用,则优先放到栈中;
2. 如果函数外部存在引用,则必定放到堆中;
注意,对于函数外部没有引用的对象,也有可能放到堆中,比如内存过大超过栈的存储能力栈空间不足逃逸。
逃逸场景
1,指针逃逸
2,栈空间不足逃逸
3 ,动态类型逃逸
4,闭包引用对象逃逸
逃逸总结
栈上分配内存比在堆中分配内存有更高的效率
栈上分配的内存不需要GC处理
堆上分配的内存使用完毕会交给GC处理
逃逸分析目的是决定内分配地址是栈还是堆
逃逸分析在编译阶段完成
参考:《go专家编程》