2013-05-13 84 views
5

我有一个写入go的服务,在运行时需要6-7G内存(RES位于顶部)。所以我使用pprof工具来找出问题所在。为何'golang heap profile'中的Total MB'小于'RES'?

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

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

我试着用GOGC关闭我的服务,结果'Total MB'和'RES'完全一样。看起来内存是GCed,但没有返回内核将不会被分析。

有什么想法?

P.S,我在1.0.3和1.1rc3都测试过。

+0

rumtime;这听起来很有趣:) – thwd 2013-05-13 07:28:19

+0

@Tom哎呀,错字:) – 2013-05-13 07:32:35

回答

4

这是因为Go当前不会将GC编辑对象的内存返回给操作系统,准确地说,只有对于小于预定义的限制(32KB)的对象。取而代之的是内存缓存,以加快未来的分配Go:malloc。另外,看起来这将在未来TODO中得到修复。

+0

非常感谢,我也遇到过这个线程。实际上,我已经在Go1.1rc3的“runtime/debug”中对FreeOSMemory()进行了测试。帮助不大。目前Go版本中的任何配方都可以解决这个问题?也许用cgo操纵一些关键内存? – 2013-05-14 02:41:30

+0

只有尽量减少临时对象的创建才能理解。甚至可能用pprof来查看哪些是最大的罪犯。像指定切片等容量的东西不会受到伤害。所有其他的东西,恕我直言,应该由Go的GC来处理。 – Gvozden 2013-05-14 09:43:02

+1

你知道这个问题的现状吗? – 2014-01-30 22:11:26

相关问题