我有一个用 go 编写的服务,在运行时需要 6-7G 内存(RES 在顶部)。所以我使用 pprof 工具试图找出问题所在。
go tool pprof --pdf http://<service>/debug/pprof/heap > heap_prof.pdf
但结果只有大约 1-2G 内存(pdf 中的“Total MB”)。剩下的在哪里?
我尝试使用 GOGC=off 来分析我的服务,结果“Total MB”与顶部的“RES”完全相同。看来内存已被GC但尚未返回内核将不会被分析。
任何想法?
P.S,我已经在 1.0.3 和 1.1rc3 中进行了测试。
这是因为 Go 目前不会将 GC 对象的内存返还给操作系统,准确地说,仅适用于小于预定义限制(32KB)的对象。相反,内存被缓存以加速未来的分配。另外,看来这个问题将来会得到解决TODO https://groups.google.com/d/msg/golang-nuts/WBlJjT-zu7E/hJJRSBGfKsIJ.
编辑:
新的 GC 行为:如果内存一段时间(大约 5 分钟)没有使用,运行时将建议内核从未使用的虚拟范围中删除物理映射。可以通过调用强制执行此过程runtime.FreeOSMemory()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)