首页 > 解决方案 > go中栈内存和mcache的区别或关系?

问题描述

现在我在学习go内存管理,分配一个小对象时,分配器会去mcache中对应的mspan中查找,而且我们也知道goroutine有栈内存,那么是不是说mcache中的span是属于栈内存的(不是堆)?如果我们在 func 中定义一个变量,内存中会发生什么a := 1

标签: gomemorygoroutineallocator

解决方案


这可能会有所帮助https://go101.org/article/memory-block.html

您还可以使用以下命令查看内存中发生的确切分配

go build -gcflags=-m your_file.go

只有那些动态使用的东西才分配给堆。

package main

import "fmt"

func f() *int {
    var x int
    return &x
}

func main() {
    fmt.Println(f())
}

go build -gcflags=-m encyptionDecryption.go

./encyptionDecryption.go:5:6: can inline f
./encyptionDecryption.go:11:15: inlining call to f
./encyptionDecryption.go:7:9: &x escapes to heap
./encyptionDecryption.go:6:6: moved to heap: x
./encyptionDecryption.go:11:15: f() escapes to heap
./encyptionDecryption.go:11:15: &x escapes to heap
./encyptionDecryption.go:11:15: moved to heap: x
./encyptionDecryption.go:11:13: main ... argument does not escape

这是逃避分析。你可以在这里阅读更多


推荐阅读