go栈内存管理
堆和栈都是编程语言里的虚拟概念,并不是说在物理内存上有堆和栈之分,
两者的主要区别是栈是每个线程或者协程独立拥有的,从栈上分配内存时不需要加锁。
而整个程序在运行时只有一个堆,从堆中分配内存时需要加锁防止多个线程造成冲突,
同时回收堆上的内存块时还需要运行可达性分析、引用计数等算法来决定内存块是否能被回收,
所以从分配和回收内存的方面来看栈内存效率更高。
堆空间:make或者new
堆区的内存一般由编译器和工程师自己共同进行管理分配,交给 Runtime GC 来释放。
堆上分配必须找到一块足够大的内存来存放新的变量数据。
后续释放时,垃圾回收器扫描堆空间寻找不再被使用的对象。
Anytime a value is shared outside the scope of a function’s stack frame,
it will be placed (or allocated) on the heap.
(内存逃逸)
栈:每个goroutine都有自己的栈,大小2kB,由编译器自动分配和释放
变量到底分配堆还是栈上?
从正确的角度来看,你不需要知道。Go 中的每个变量只要有引用就会一直存在。
变量的存储位置(堆还是栈)和语言的语义无关。
尽可能分配栈上
go build -gcflags ‘-m’
go perfromance
逃逸案例
很多case会出现逃逸
连续栈
(内联优化,将小函数copy到整体中,减少函数调用保存变量和切换上下文的消耗)
分段栈会导致频繁的alloc和free,而连续栈采用扩容并复制旧栈内容的方式来避免这种情况。
栈扩容
递归调用是否插入morestatck
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通