每日小记2023.9.1
内存管理对堆而言的,程序在运行时主动从堆上申请内存,这些内存通过go的内存分配器分配,由垃圾回收器回收。
栈是每个goroutine独有的,不需要在操作的时候加锁,而堆上的内存有时需要加锁防止多线程冲突。对程序上的内存回收需要通过标记清除阶段,比如采用三色标记法。对栈而言,他的分配和释放是十分廉价的,借助栈相关寄存器完成,两个命令即可:分配入栈和栈内释放。
逃逸分析:哪些东西分配到堆栈上呢?GO编译器尽可能将变量分配到栈上,当编译器无法证明函数返回后,该变量没有被引用,编译器就必须在堆上分配该变量,如果局部变量非常大,会分配到堆上。
基本思想:检查变量的生命周期是否是可知的,通过检查在栈上分配,否则就是逃逸,必须分配到堆上。
注意:逃逸分析是在编译器完成的;如果变量在函数外部没有引用,优先放在栈中;如果变量在函数外部存在引用,则必定放在堆中。
了解逃逸分析可以帮我们更好的写程序。我们应该尽量写出分配到栈上的代码,堆上的代码变少,减少内存分配的开销,减少gc压力,提高程序运行速度。
比如go项目中,在传参时没有传结构体指针,直接传递结构体,通过值拷贝的方式,但是操作在栈中操作,开销比逃逸后的开销小得多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!