1.变量逃逸的类型
- 变量较大(栈空间不足)
- 变量大小不确定(如 slice 长度或容量不定)
- 返回地址(指针逃逸)
- 返回引用(引用变量的底层是指针)
- 返回值类型不确定(不能确定大小,如interface等动态数据类型)
- 闭包
- 其他
2.逃逸分析
逃逸分析,是一种可以有效减少程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。 逃逸分析(Escape Analysis)算是目前比较前沿的优化技术了。
3.逃逸分析原则
-
如果函数外部没有引用,则优先放到栈中
-
如果函数外部存在引用,则必定放到堆中
-
如果栈上放不开,则必定放到堆上
#逃逸分析常用命令
go build -gcflags=-m
一般情况下,不会逃逸的对象所占空间比较大,如果能使用栈上的空间,那么大量的对象将随方法的结束而销毁,减轻了GC压力