memory-management - 为什么我的 Go 程序内存波动这么大?

标签 memory-management go

我有一个分配大量映射和 slice 的 Go 程序。通常有很多使用、分配开销等。我运行它,它加载大量数据,然后我使用 Web 服务查询它。

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

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

可能的解释是

  • 大量小分配的开销只会乘以任何自然波动
  • 一些代码正在分配对象(虽然我看不到如何分配)
  • Go GC 正在执行自己的分页(?)
  • 我使用的是 Mac 操作系统,但不知何故出了问题

这个波动量是否正常/预期?

最佳答案

go-runtime 不会立即将未使用的内存释放给操作系统(可能很快会再次需要)。 因此,从操作系统层面来看,您只能看到整体情况的一部分。 使用 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/

相关文章:

unit-testing - 测试包含 stderr、stdout 和 os.Exit() 的函数

memory-management - 'unowned(safe)' 和 'unowned(unsafe)' 之间的 Swift 有什么区别?

go - 一种不使用最新的err值写长延迟的方法?

ios - 消息发送到已释放的实例

java - JNI 对象创建和内存管理

go - 从缓冲 channel 和非缓冲 channel 中选择

go - 使用引用同时处理结构 slice

go - 类型 *url.URL 没有字段或方法 ParseRequestURI

android - 要求和内存消耗

python - 限制 Tensorflow CPU 和内存使用