go - go中栈内存和mcache的区别或关系?
问题描述
现在我在学习go内存管理,分配一个小对象时,分配器会去mcache中对应的mspan中查找,而且我们也知道goroutine有栈内存,那么是不是说mcache中的span是属于栈内存的(不是堆)?如果我们在 func 中定义一个变量,内存中会发生什么a := 1
?
解决方案
这可能会有所帮助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
这是逃避分析。你可以在这里阅读更多
推荐阅读
- error-handling - 无法将笔记本上传到 jovian
- android - 即使应用程序被杀死或在后台,如何连续执行方法
- php - 重新安装 wamp 3.2.3 和 PHP 7.3 后的 PHP 错误
- node.js - 如何在 expressjs 中使用多个中间件?
- java - 在 Java 字符串中取 NOT 条件
- ios - 如何在后台 ios 13 swift 中从 CMMotionManager 获取运动更新
- winforms - 无法使用 C++/CLI 在 Windows 窗体的面板中添加按钮
- python - 从字典中检索列表时如何创建列表
- javascript - 从子表更新父表单元格值
- flutter - 颤振图标不在容器中居中