为什么golang堆配置文件中的“Total MB”小于顶部的“RES”?

时间:2013-05-13 06:42:32

标签: go pprof

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

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

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

我尝试使用GOGC = off配置我的服务,因此'Total MB'与顶部的'RES'完全相同。似乎内存是GCed但尚未返回内核将不会被分析。

有什么想法吗?

P.S,我已经在1.0.3和1.1rc3中进行了测试。

1 个答案:

答案 0 :(得分:6)

这是因为Go当前不会将GC-ed对象的内存返回给操作系统,确切地说,仅适用于小于预定义限制(32KB)的对象。而是缓存内存以加速未来的分配Go:malloc。此外,这似乎将在未来修复TODO

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

强制执行此过程
相关问题