Go语言逃逸分析全纪录

本文介绍了Go语言中的逃逸分析,分析了逃逸的原因、查看逃逸的方法以及常见的逃逸场景,包括指针逃逸、栈空间不足逃逸、动态分配逃逸和闭包引用对象逃逸,强调逃逸分析对于性能优化和内存管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

什么是逃逸分析?

逃逸分析是为了什么?

如何查看逃逸

哪些情况会出现逃逸

1,指针逃逸

2,栈空间不足逃逸

3,动态分配逃逸

4,闭包引用对象逃逸


什么是逃逸分析?

Go程序为变量分配内存分为两途径:

1,全局的堆空间动态分配内存
2,每个goroutine的栈空间

一般来说开发者并不需要关心内存分配在栈上 or 还是堆上。但从性能的角度出发,在栈上分配内存和在堆上分配内存,性能差异还是非常大的。


在栈上分配和回收内存的开销很低,只需要2个CPU 指令:PUSH、POP。

前者是将数据push到栈空间以完成分配,后者则是释放空间,也就是说在栈上分配内存,消耗的仅是将数据拷贝到内存的时间,而在堆上分配,一个很大的额外开销则是垃圾回收。

在Go中,堆内存通过垃圾回收机制自动管理,Go的垃圾回收采用的是标记清除算法,并且在此基础上使用了三色标记法和写屏障技术,提高了效率。

标记清除算法的一个典型操作是在标记期间,需要STW,即暂停程序(Stop the world),标记结束之后,用户程序才可以继续执行。


堆内存分配导致垃圾回收的开销远大于栈空间分配与释放的开销。


那么 Go编译器怎么知道某个变量需要分配在栈 or 堆上呢?
编译器决定内存分配位置的方式,就称之为逃逸分析(escape analysis)。逃逸分析由编译器完成,作用于编译阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProblemTerminator

您的鼓励将是作者最大的动力哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值