【发布时间】:2014-01-11 15:57:37
【问题描述】:
我有一个分配大量地图和切片的 Go 程序。通常有很多使用、分配开销等。我运行它,它会加载大量数据,然后我使用 Web 服务对其进行查询。
在我让它运行后,当它读入所有数据并且没有进行任何查询(即应该是稳定的)时,我看到内存波动。最近有报道称:5.42 GB、5.01 GB 和 4.3 GB 的实内存。这是一个巨大的波动。
我有大约 1.5 亿个对象(切片挂在主哈希表上)。那是很多小物件。我预计会有一点波动(尽管当没有分配新对象并且主线程在套接字上阻塞时,我永远不会期望内存增加)。
可能的解释是
- 大量小分配的开销只会增加任何自然波动
- 一些代码正在分配对象(虽然我看不出如何)
- Go GC 正在执行自己的分页 (?)
- 我使用的是 Mac OS,但不知何故出现了问题
这种波动量是否正常/预期?
【问题讨论】:
-
这个波动有多快?你能在这些内存使用测量上加上时间戳吗?
-
超过 10 分钟。我不能在上面加上时间戳,但如果它很重要,我可以复制。
-
不,我认为“分钟刻度”已经足够细化了。
-
您是否尝试过在代码中使用profiler?它可以帮助您识别有大量分配的区域,以便您可以更改代码以避免它们。
-
我可以,是的。我知道我正在分配很多对象,并且我知道我可以在分配方面做得更好。我的问题更多是关于我应该期望内存在分配后波动吗?
标签: memory-management go