文章摘要:golang如何避免内存逃逸 golang内存逃逸会导致什么问题
golang中避免内存逃逸的方法有:1.尽量避免使用接口类型;2.避免使用变量指针作为参数;3.设定slice […]
golang中避免内存逃逸的方法有:1.尽量避免使用接口类型;2.避免使用变量指针作为参数;3.设定slice长度,避免容量超出;4.减少外部引用, 如指针;
出现内存逃逸的情况有:
1.发送指针或带有指针的值到channel,因为编译时候无法知道那个goroutine会在channel接受数据,编译器无法知道什么时候释放。
2.在一个切片上存储指针或带指针的值。比如[]*string,导致切片内容逃逸,其引用值一直在堆上。
3.切片的append导致超出容量,切片重新分配地址,切片背后的存储基于运行时的数据进行扩充,就会在堆上分配。
4.调用接口类型时,接口类型的方法调用是动态调度,实际使用的具体实现只能在运行时确定,如一个接口类型为io.Reader的变量r,对r.Read(b)的调用将导致r的值和字节片b的后续转义并因此分配到堆上。
5.在方法内把局部变量指针返回,被外部引用,其生命周期大于栈,导致内存溢出。