本篇是根据 GopherCon SG 2019 “Understanding Allocations” 演讲的学习笔记。
Understanding Allocations: the Stack and the Heap - GopherCon SG 2019 - YouTube
在你的程序中有两种内存,栈内存和堆内存。
在 go 中,每个 go 程都会有一个栈空间,整个程序有一个堆空间。
负责堆垃圾回收的 GC 会导致整个程序的延迟,而不仅仅是创建垃圾的部分。你可能会担心你放置了多少垃圾。
要有 benchmarks 基准来证明你的程序不够快(有大量的堆内存分配),够快就不用多此一举了。
你要先确保程序正确性(业务处理),而不是先看重性能。
函数和变量同时被挤压入栈,一个函数为一个堆栈帧。
执行完成后,你会发现黑线(只是用于区分)向上移,上方内容为有效内容,下方内容为无效内容
go 声明了新的内存部分,我们有了新的堆栈帧用于打印行。黑线下移。
通俗的来讲,栈空间会进行自我清理,任何变量都会被清理干净,空间会被重复使用。
虽然使用了指针,但这种情况下它能够留在堆栈上,共享向下时,通常留在栈空间上。
这破坏了原有的值
sharing up typically escapes to the heat