【发布时间】:2015-10-11 17:35:53
【问题描述】:
当我使用 make 或 new 调用创建新切片或结构时:
s := make([]int64, 10, 100)
o := new(MyStruct)
Go 通过内存分配系统调用分配多少内存?它是否预先分配内存,以便后续调用不会触发新的系统调用?
我问这个是因为我需要在我的代码中经常分配内存。我不确定我是否需要自己实现一个内存分配器,或者我是否可以依靠 Go 来做这些脏活。如果 Go 确实预先分配了内存,我可以自定义分配的块大小吗?
我用 Go 写了一些实验代码,在 strace 下运行代码,但是我不明白 Go 对 mmap 系统调用做了什么:
mmap(0xc000000000, 65536, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
munmap(0xc000000000, 65536) = 0
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1017000
mmap(0xc208000000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc208000000
mmap(0xc207ff0000, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc207ff0000
mmap(0xc000000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1007000
mmap(NULL, 1439992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd0ea7000
【问题讨论】:
-
你可以依靠 Go 来做这些脏活。它要求系统获得的不仅仅是您为小的
make/new调用分配的内容。如果您需要详细信息,github.com/golang/go/blob/master/src/runtime/mem_linux.go 可能是一个起点。但总的来说,我认为你想构建你的产品,然后让配置文件告诉你什么是慢。 -
快速问题:Go 是否会在保留内存中分配不同大小的插槽以避免碎片?也许我需要阅读源代码...
标签: memory memory-management go dynamic-memory-allocation