我有一个Go程序,可以分配很多 map 和 slice 。通常有很多用法,分配开销等。我运行它,它加载了很多数据,然后使用Web服务对其进行查询。
在我让它运行之后,当它读完所有数据并且不执行任何查询(即应该是稳定的)时,我会看到内存波动。最近有报道:实际内存为5.42 GB,5.01 GB和4.3 GB。那是巨大的波动。
我有大约1.5亿个对象( slice 卡在主哈希表上)。那是很多小 object 。我希望有一点波动(尽管当分配新对象且主线程在套接字上阻塞时,我永远都不会期望内存增加)。
可能的解释是
此波动量正常/预期吗?
最佳答案
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/