逃逸分析

2020-02-14  本文已影响0人  自由编程

From - 自由编程


所谓逃逸分析(Escape analysis),是指由编译器进行内存分配策略分析, 通过编译参数-gcflag=-m可以查看编译过程中的逃逸分析。
如:

go build -gcflags="-m"

一般的,函数申请一个对象可能存放在堆或栈中

如果分配在栈中,则函数执行结束可自动将内存回收;
如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理;

编译器跟据对象是否被函数外部引用来决定存放位置:

如果函数外部没有引用,则优先放到栈中;
如果函数外部存在引用,则必定放到堆中;

如下面一段代码escape.go

package main

type One struct {
    Name string
}

func OneRegister(name string) *One {
    s := new(One) //局部变量s逃逸到堆
    s.Name = name
    return s
}

func main() {
    OneRegister("Jim Green")
}

在执行编译命令后提示“escapes to heap”,表示该行内存分配发生了逃逸现象。

go build -gcflags="-m" escape.go 

# command-line-arguments
./escape.go:7:6: can inline OneRegister
./escape.go:13:6: can inline main
./escape.go:14:13: inlining call to OneRegister
./escape.go:7:18: leaking param: name
./escape.go:8:10: new(One) escapes to heap
./escape.go:14:13: main new(One) does not escape
上一篇下一篇

猜你喜欢

热点阅读