几个底层知识点

1、栈内存分配和释放非常快

2、堆内存需要依靠Go垃圾回收(占CPU)

3、通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上

Go的主要目的并不希望程序员关注分配,而是通过编译时的代码分析自动决定

逃逸分析是什么

通俗来讲,当一个对象的指针被多个方法或线程引用时,就称这个指针发生了逃逸

逃逸分析呢,就是Go在编译阶段确定一个变量它是分配在对堆还是栈的一种行为。

逃逸分析有什么用

通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻分配堆内存的开销,同时也会减少gc的压力,提高程序的运行速度。

逃逸分析是怎么完成的

编译器会根据变量是否被外部引用来决定是否逃逸:

1.如果函数外部没有引用,则优先放到栈中;

2.如果函数外部存在引用,则必定放到堆中;

如何确定逃逸分析

使用go命令:

go build -gcflags '-m -l' main.go

-m 用于输出编译器的优化细节(包括使用逃逸分析这种优化),使用-N来挂u关闭编译器优化,而-l则用于禁用foo函数的内联优化,防止逃逸被编译器通过内联优化彻底抹除。

三种常见情况

1.局部变量原本应该在栈中分配,在栈中回收。由于返回时被外部引用

func test() []int{
    a := []int{1,2,3}
    a[1] = 4
    return a
}

2.interfaces

3.struct是否使用指针

最后修改:2022 年 06 月 30 日
如果觉得我的文章对你有用,请随意赞赏