Golang的逃逸分析

所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。 函数中申请一个新的对象如果分配在栈中,则函数执行结束可自动将内存回收;如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理.

每当函数中申请新的对象,编译器会跟据该对象是否被函数外部引用来决定是否逃逸: 1. 如果函数外部没有引用,则优先放到栈中; 2. 如果函数外部存在引用,则必定放到堆中.

注意,对于函数外部没有引用的对象,也有可能放到堆中,比如内存过大超过栈的存储能力。

逃逸分析通常有四种情况:

  • 指针逃逸

  • 栈空间不足逃逸

  • 动态类型逃逸

  • 闭包引用对象逃逸

逃逸总结

  • 栈上分配内存比在堆中分配内存有更高的效率.
  • 栈上分配的内存不需要GC处理.
  • 堆上分配的内存使用完毕会交给GC处理.
  • 逃逸分析目的是决定内分配地址是栈还是堆.
  • 逃逸分析在编译阶段完成.
最后编辑: kuteng  文档更新时间: 2021-09-14 14:49   作者:kuteng