参考链接:
https://blog.csdn.net/dh626995617/article/details/103975229
https://zhuanlan.zhihu.com/p/76802887

image.png

堆和栈

  • 栈在高地址,从高地址向低地址增长
  • 堆在低地址,从低地址向高地址增长

golang管理内存在堆栈上进行管理
栈内存主要用于局部变量申请内存,每个函数中每个值在栈中都是独占的,不能在其他栈中被访问。每个方法片(function frame)都有一个自己的独享栈,这个栈的生命周期随着方法开始结束诞生与消逝,在方法结束时候会被释放掉,较之于堆,栈的优势是比较轻量级,随用随弃,存活期跟随着函数

内存逃逸,从栈到堆

堆内存主要用于复杂内存管理
通俗的讲,假如说栈是各个函数的一栋私人住宅,堆就是一个大型的人民广场,它可以被共享。堆作为一个全局访问块,它的空间由GC(拆迁大队)管理

The heap is not self cleaning like stacks, so there is a bigger cost to using this memory. Primarily, the costs are associated with the garbage collector (GC), which must get involved to keep this area clean

比较:

栈的内存管理简单,分配比堆上快。
栈的内存不需要回收,而堆需要进行回收,无论是主动free,还是被动的垃圾回收,这都需要花费额外的CPU。
栈上的内存有更好的局部性,堆上内存访问就不那么友好了,CPU访问的2块数据可能在不同的页上,CPU访问数据的时间可能就上去了。