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

posted @   影随风动91  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示