Memory Go如何在拨打或拨打新电话时分配内存?

Memory Go如何在拨打或拨打新电话时分配内存?,memory,memory-management,go,dynamic-memory-allocation,Memory,Memory Management,Go,Dynamic Memory Allocation,使用make或new调用创建新切片或结构时: s := make([]int64, 10, 100) o := new(MyStruct) 内存分配系统调用会分配多少内存?它是否预先分配内存,以便后续调用不会触发新的系统调用 我这样问是因为我需要在代码中频繁分配内存。我不确定我是否需要自己实现一个内存分配器,或者我是否可以依靠Go来完成这些脏活。如果Go预先分配内存,我可以自定义块大小以进行分配吗 我在Go中编写了一些实验代码,并在strace下运行代码,但我不了解Go对mmap系统调用的作用

使用make或new调用创建新切片或结构时:

s := make([]int64, 10, 100)
o := new(MyStruct)
内存分配系统调用会分配多少内存?它是否预先分配内存,以便后续调用不会触发新的系统调用

我这样问是因为我需要在代码中频繁分配内存。我不确定我是否需要自己实现一个内存分配器,或者我是否可以依靠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
您可能会患上“过早优化”综合症。语言规范没有说明如何准确地分配
make()
分配的内存

例如,Go的一致性实现可能会对函数进行彻底的分析,该函数会生成([]foo,…),并证明:

  • 返回的切片值未超出函数的作用域
  • 未对此切片值调用
    append()
  • 它没有传递给任何被调用函数的切片值
  • 在这种情况下,切片的备份存储可能就在堆栈上分配

    当然我是在举例说明,但是再一次,语言规范中没有声明这一点的语义。目前有两个成熟的Go实现(一个源于Google,称为
    gc
    ,另一个名为
    gccgo
    ),还有更多的实现(
    llvmgo
    似乎有很好的机会实现),它们都有各自的特点

    <>请考虑阅读<代码> pPROF并进行大体上的剖析,并做配置样本(但实数)代码。< /P> 搜索单词“profile”、“profiling”、“heap和profile”、“CPU和profile”以及“pprof”将为您提供很多关于它的见解


    同时考虑和。

    你可以放心去做那些肮脏的工作。它向系统发出呼吁,要求获得的不仅仅是您为小的
    发出的
    /
    新的
    调用分配的内容。如果您需要详细信息,这可能是一个起点。但一般来说,我认为您希望构建您的产品,然后让配置文件告诉您什么是慢的。快速问题:是否在保留内存中分配不同大小的插槽,以避免碎片?也许我需要阅读源代码……仅供参考,我正在尝试实现缓存服务器,因此内存管理不是过早的优化。@NeoWang,那么您可能会对or或感兴趣。@NeoWang,总的来说,我强烈建议您在邮件列表上问一个问题,明确提及您的任务并征求意见。所以这是一种错误的研究媒介,真的。是memcache作者的一个库,具有不同的设计目标。