我有一个Go程序,可以分配很多 map 和 slice 。通常有很多用法,分配开销等。我运行它,它加载了很多数据,然后使用Web服务对其进行查询。

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

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

可能的解释是

  • 许多小分配的开销只会乘以任何自然波动
  • 一些代码正在分配对象(尽管我看不到)
  • Go GC正在执行自己的分页(?)
  • 我正在使用Mac OS,但由于某种原因出现了故障

  • 此波动量正常/预期吗?

    最佳答案

    go-runtime不会立即将未使用的内存释放到OS(可能很快会再次需要)。
    因此,从操作系统级别看,您只看到整体情况的一部分。
    使用http://golang.org/pkg/runtime/#ReadMemStats您可以看到图片的另一部分。

    pkg/runtime/malloc.goc显示了空闲列表,而pkg/runtime/mgc0.c显示了垃圾收集器。

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

    关于memory-management - 为什么我的Go程序的内存波动很大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21064426/

    10-12 06:30