Go-逃逸分析

首先解释什么是逃逸:

用于确定程序中对象的生命周期是否局限在方法内部。如果一个对象在方法内创建,并且在方法结束后不再被引用,那么该对象可以被认为是不逃逸的,即其生命周期局限在方法内部。相反,如果一个对象在方法内创建后被返回给调用者,或者被赋值给方法外部的引用,那么该对象就会逃逸出方法的作用域。

逃逸分析

分析指针动态范围的方法被称之为逃逸分析。通俗来讲,当一个对象的指针被多个方法或线程引用时,则称这个指针发生了逃逸。逃逸分析决定一个变量是分配在堆上还是分配在栈上。

逃逸分析的作用

逃逸分析把变量合理的分配到他该去的地方

go的编译器会自动的进行逃逸分析

如果编译器发现这块内存在退出函数后就没有使用了,那就分配到栈上,栈上的内存分配比堆上快很多

如果编译器分析这块内存在退出函数之后还继续使用,就会分配到堆上按需分配

栈可以自动清理 , 堆要借助gc ,堆上面变量太多又会频繁的引起gc,gc又会占用比较大的系统开销

堆和栈相比:堆适合不可预知大小的内存分配,但是代价是分配速度比较慢,会形成内存碎片

栈内存分配非常快,并且会自动释放

目的就是 通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻堆内存分配的开销,同时减少垃圾回收,提高程序运行速度

逃逸分析过程

go最基本的逃逸分析原则:如果一个函数返回对一个变量的引用,那么这个变量就会发生逃逸

编译器通过分析代码来决定将变量分配到何处

变量在函数外部没有被引用,优先放到栈上

变量在函数外部存在引用,必定放到堆上

分析的命令行

复制代码
go build -gcflags '-m-l' main.go

GO中的堆栈

c/c++ 中的堆栈,操作系统自动维护一个所启动程序消耗内存的地址空间,将这个空间逻辑上划分为堆空间和栈内存空间,这时的栈:是指程序运行时自动获取的一小块内存,在栈中自动释放的本质是可以被无条件覆盖,对于堆而言,每次申请内存,所需空间从维护的堆内存地址空间中分配出去,而在归还时则会将归还的内存合并到所维护的地址空间中

GO传统意义上的栈,go语言放入了调度器,垃圾回收,系统调用等, go中的堆和栈其实是go运行时通过管理向操作系统申请的堆内存,构造逻辑上的堆和栈,本质都是从堆申请内存得来的,

在必要的时候,go为了防止内存碎片化,会在合适的时候堆整个栈进行深度拷贝,然后放到别的地方

相关推荐
青石路几秒前
如果写Redis序列化与读Redis序列化不一致,你觉得会发生什么
java·redis
煎饼学大模型6 分钟前
架构决定上限:Skill 知识架构的三次重构实践
java·重构·架构·skill
llwszx13 分钟前
【Java/Go后端手撸原生Agent(第五篇):多工具并行调用 + BashTool执行引擎 + Judge证据链升级】
java·后端·golang·状态机·pydantic·agnet·llm-as-judge
奈何不吃鱼14 分钟前
【SpringBoot】业务多线程四大实战场景
java·spring boot·多线程
FfHUCisI16 分钟前
Go语言程序结构 —— 变量、声明与零值机制
golang
问商十三载23 分钟前
2026法律行业AI引擎生成式优化怎么优化?三层专业加固提排名,零成本提33%引用率附适配表
java·前端·人工智能·算法
野生风长24 分钟前
c++类和对象(this指针,重载operator,习题总结)
java·开发语言·c++
霸道流氓气质34 分钟前
基于 Spring 事务同步机制的事务后置动作收集器 Starter 实践
java·后端·spring
过期动态39 分钟前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
超人不会飞_Jay1 小时前
Go课程2
开发语言·后端·golang