其他分享
首页 > 其他分享> > GopherCon SG 2019 "Understanding Allocations" 学习笔记

GopherCon SG 2019 "Understanding Allocations" 学习笔记

作者:互联网

本篇是根据 GopherCon SG 2019 “Understanding Allocations” 演讲的学习笔记。

Understanding Allocations: the Stack and the Heap - GopherCon SG 2019 - YouTube


理解分配:栈和堆

在你的程序中有两种内存,栈内存和堆内存。

image-20220402085721628

在 go 中,每个 go 程都会有一个栈空间,整个程序有一个堆空间。


如何知道变量是在栈还是堆上

image-20220402090134921

负责堆垃圾回收的 GC 会导致整个程序的延迟,而不仅仅是创建垃圾的部分。你可能会担心你放置了多少垃圾。


什么时候需要优化

image-20220402090405261

要有 benchmarks 基准来证明你的程序不够快(有大量的堆内存分配),够快就不用多此一举了。

你要先确保程序正确性(业务处理),而不是先看重性能。


普通类型参数传递

执行至第5行

函数和变量同时被挤压入栈,一个函数为一个堆栈帧。

image-20220402090854892

执行完成后,你会发现黑线(只是用于区分)向上移,上方内容为有效内容,下方内容为无效内容

image-20220402091022503

执行至第6行

image-20220402091208725

go 声明了新的内存部分,我们有了新的堆栈帧用于打印行。黑线下移。

通俗的来讲,栈空间会进行自我清理,任何变量都会被清理干净,空间会被重复使用。


指针类型参数传递

执行至第4行

image-20220402091731899

执行至第5行进入inc函数

image-20220402091848706

inc函数执行完

image-20220402091940275

执行 Println

image-20220402092013903

总结

虽然使用了指针,但这种情况下它能够留在堆栈上,共享向下时,通常留在栈空间上。


函数返回指针

执行至第4行,进入answer函数前

image-20220402092408388

进入函数

image-20220402092816889

执行 Println

image-20220402092908776

这破坏了原有的值

image-20220402093057260

sharing up typically escapes to the heat

Escape Analysis

image-20220402162719312

image-20220402162815103

image-20220402162929960

image-20220402163001136

image-20220402163016040

image-20220402163024090

image-20220402163050766

image-20220402164009984

image-20220402164149835

image-20220402164217660

image-20220402164256481

image-20220402164503442

标签:函数,Understanding,2019,内存,Allocations,go,执行,GopherCon
来源: https://www.cnblogs.com/linxiaoxu/p/16095012.html