Go 里想快速看逃逸分析结果,最常用的是:
1go build -gcflags="-m"
如果想看得更详细一点:
1go build -gcflags="-m -m"
一个最小例子:
1func newUser() *User {
2 u := User{Name: "codex"}
3 return &u
4}
通常这种返回局部变量地址的场景,会让变量逃逸到堆上。
判断时不要只盯“是否逃逸”,还要看:
- 这个对象是否真的在热点路径上
- 堆分配次数是否明显增加
- GC 压力是否真的上来了