Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 为什么我的围棋计划';谁的记忆波动这么大?_Memory Management_Go - Fatal编程技术网

Memory management 为什么我的围棋计划';谁的记忆波动这么大?

Memory management 为什么我的围棋计划';谁的记忆波动这么大?,memory-management,go,Memory Management,Go,我有一个Go程序,可以分配很多地图和切片。通常会产生大量的使用、分配开销等。我运行它,它会加载大量数据,然后我使用web服务查询它 在我让它运行之后,当它读入所有数据并且不执行任何查询(即应该是稳定的)时,我看到内存波动。最近有报道称:5.42 GB、5.01 GB和4.3 GB的真实内存。这是一个巨大的波动 我有大约1.5亿个对象(挂在主哈希表上的切片)。那是很多小东西。我预计会有一点波动(尽管当没有分配新对象且主线程在套接字上阻塞时,我永远不会期望内存增加) 可能的解释是 大量小规模分配的

我有一个Go程序,可以分配很多地图和切片。通常会产生大量的使用、分配开销等。我运行它,它会加载大量数据,然后我使用web服务查询它

在我让它运行之后,当它读入所有数据并且不执行任何查询(即应该是稳定的)时,我看到内存波动。最近有报道称:5.42 GB、5.01 GB和4.3 GB的真实内存。这是一个巨大的波动

我有大约1.5亿个对象(挂在主哈希表上的切片)。那是很多小东西。我预计会有一点波动(尽管当没有分配新对象且主线程在套接字上阻塞时,我永远不会期望内存增加)

可能的解释是

  • 大量小规模分配的开销只是自然波动的倍数
  • 一些代码正在分配对象(尽管我不知道如何分配)
  • Go GC正在执行自己的分页(?)
  • 我用的是Mac操作系统,不知怎的,这是我的错

这种波动量是正常的/预期的吗?

go运行时不会立即将未使用的内存释放到操作系统中(可能很快会再次需要)。 因此,从操作系统层面来看,您只看到了整体情况的一部分。 使用此选项,您可以看到图片的另一部分

pkg/runtime/malloc.goc显示自由列表,pkg/runtime/mgc0.c显示垃圾收集器


如果内存使用率在一种看似正常的稳定情况下下降,那么在加载完成后,您可以强制执行GC,并且您可能希望定期打印Memstats以获取更多信息。

这种波动可能是由于您的程序创建的垃圾量,垃圾收集器最终必须收集垃圾量造成的。波动的频率将取决于您创建垃圾的数量/频率以及垃圾收集器收集垃圾的时间

是将变量分配给堆栈还是堆由编译器决定。通常,指针、映射和片可以分配给堆,但这只有在编译器的转义分析确定某个变量转义时才会发生。分配给堆的任何内容都需要进行垃圾收集

即使Go处理堆栈与堆的细节,创建尽可能少的垃圾也会带来很大的好处。你可以读到。Go垃圾收集器并不完美。它改善得越多,你就越不必担心它。但你至少应该意识到这一点

您可以运行以下命令来确定编译器将分配给堆的内容:

go build -gcflags=-m program.go

您可能会对实际分配给堆的内容感到惊讶。例如,即使您在本地使用bytes.Buffer,由于以下原因,它仍然会被分配到堆中。不管这是否应该发生,在某些情况下,你可能认为自己没有制造任何垃圾,但事实上你确实如此。

这种波动有多快?你能在这些内存使用量测量上加上时间戳吗?在10分钟内。我不能在上面加时间戳,但如果重要的话可以复制。不,我认为“分钟尺度”已经足够精细了。你试过在你的代码上使用时间戳吗?它可以帮助你确定你有很多分配的区域,这样你就可以修改代码来避免它们。我可以,是的。我知道我正在分配很多对象,我知道我可以在分配方面做得更好。我的问题更多的是关于我应该期望内存在分配后波动吗?谢谢,如果这种情况再次发生,我将查看memstats。你知道为什么内存消耗会增加吗?