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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值