go 内存逃逸

本文介绍了Go语言中的内存逃逸现象,分析了何时会发生内存逃逸,如函数返回局部变量指针、使用channel传递指针等。逃逸分析是Go编译器用于决定变量存储位置的关键过程,影响程序的性能。了解内存逃逸可以帮助开发者编写更高效的Go代码,减少不必要的堆分配,提升程序运行速度。
摘要由CSDN通过智能技术生成

接触go后就经常碰到一个概念 就是内存逃逸,今天就来分析一下内存逃逸

一:什么叫内存逃逸

        首先go的变量要不在栈上要不在堆上,栈上的变量会在函数销毁的时候就释放了,堆上的就要靠gc算法来了,我们一般说从栈逃逸到堆上或者一开始直接就在堆上的变量内存叫做内存逃逸

二:什么时候会内存逃逸

        引起内存逃逸的关键就是,编译器在编译的时候无法确定确定变量的生命周期,只能在运行时控制了

  • 函数返回了局部变量的指针
  • 发送指针或者带有指针的数据进channel
  • 在切片上存储指针或带有指针的值
  • 切片扩容
  • 调用interface的方法(fmt.println)
  • 堆上动态分配内存比栈上静态分配内存,开销大很多。
  • 变量分配在栈上需要能在编译期确定它的作用域,否则会分配到堆上。
  • Go编译器会在编译期对考察变量的作用域,并作一系列检查,如果它的作用域在运行期间对编译器一直是可知的,那么就会分配到栈上。简单来说,编译器会根据变量是否被外部引用来决定是否逃逸。
  • 对于Go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags '-m'命令来观察变量逃逸情况就行了。
  • 不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。
  • 最后,尽量写出少一些逃逸的代码,提升程序的运行效率。
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值