6

我有一个用 go 编写的服务,它在运行时需要 6-7G 内存(顶部是 RES)。所以我使用 pprof 工具试图找出问题所在。

go tool pprof --pdf http://<service>/debug/pprof/heap > heap_prof.pdf

但是结果中只有大约 1-2G 内存(pdf 中的“总 MB”)。剩下的在哪里?

我已经尝试使用 GOGC=off 来分析我的服务,结果“总 MB”与顶部的“RES”完全相同。似乎内存已被 GC,但尚未返回内核将不会被分析。

任何的想法?

PS,我在 1.0.3 和 1.1rc3 都测试过。

4

1 回答 1

10

这是因为 Go 目前不会将 GC 对象的内存归还给操作系统,准确地说,仅适用于小于预定义限制 (32KB) 的对象。相反,内存被缓存以加速未来的分配Go:malloc。此外,这似乎将在未来的TODO中得到解决。

编辑:新的 GC 行为:如果内存有一段时间(大约 5 分钟)未使用,运行时将建议内核从未使用的虚拟范围中删除物理映射。这个过程可以通过调用来强制runtime.FreeOSMemory()

于 2013-05-13T13:27:38.143 回答