https://driverzhang.github.io/post/golang%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E9%80%83%E9%80%B8%E5%88%86%E6%9E%90/
在函数中申请一个新的对象:
如果分配在栈中,则函数执行结束可自动将内存回收,系统管理如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理,用户管理申请到 栈内存 好处:函数返回直接释放,不会引起垃圾回收,对性能没有影响。函数传递指针不一定比传值效率高。传递指针可以减少底层值的拷贝,可以提高效率,但是如果拷贝的数据量小,由于指针传递会产生逃逸,可能会使用堆,也可能会增加GC的负担,所以传递指针不一定是高效的。所有对象默认都在栈中,当有下列情况时,对象逃逸到堆中:
对象作为函数的返回值返回,包括指针和值类型对象申请的空间过大对象申请空间未知闭包逃逸分析的好处是为了减少gc的压力,不逃逸的对象分配在栈上,当函数返回时就回收了资源,不需要gc标记清除。
逃逸分析完后可以确定哪些变量可以分配在栈上,栈的分配比堆快,性能好(逃逸的局部变量会在堆上分配 ,而没有发生逃逸的则有编译器在栈上分配)。
同步消除,如果你定义的对象的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的机器码,会去掉同步锁运行。
栈上分配内存比在堆中分配内存有更高的效率
栈上分配的内存不需要GC处理
堆上分配的内存使用完毕会交给GC处理
逃逸分析目的是决定内分配地址是栈还是堆
逃逸分析在编译阶段完成