Go 里想快速看逃逸分析结果,最常用的是:

1go build -gcflags="-m"

如果想看得更详细一点:

1go build -gcflags="-m -m"

一个最小例子:

1func newUser() *User {
2    u := User{Name: "codex"}
3    return &u
4}

通常这种返回局部变量地址的场景,会让变量逃逸到堆上。

判断时不要只盯“是否逃逸”,还要看:

  • 这个对象是否真的在热点路径上
  • 堆分配次数是否明显增加
  • GC 压力是否真的上来了