我刚将一些代码从C / C ++移植到Go,它是一个微服务。它运行良好,甚至比C / C ++更快。但我的记忆存在问题。
当我的程序启动时,它将分配大约4.5GB的RAM,并在盘中加载数据并在加载时处理数据,然后它将运行数天(希望是几个月)来处理来自RAM的请求。不幸的是,在RAM中处理和放置数据之后,Go仍然分配了额外的3.5 GB RAM。我没有做任何解除分配,只有分配,我认为我的程序在任何时候都不会真正使用8 GB,所以我认为Go只是获得额外的RAM,因为它感觉"我可能需要更快,但我不会。
我读到Go不允许任何功能解除分配未使用的RAM以将其返回系统。我想在同一台机器上运行更多的服务,尽可能多地节省RAM,所以浪费的几乎和我真正使用的一样多。感觉不对。
那么如何保持内存占用空间紧凑,避免Go分配空3.5 GB?
答案 0 :(得分:1)
谈到虚拟内存(请参见 Go Memory Management 和Povilas Versockas中的“ RSS vs. VSZ”),请勿尝试使用Go 1.11编写程序。
请参见golang/go
issue 28114:“运行时:由1.11编译的程序分配了不合理的虚拟内存量。”
还有discussed here。
可能与以下内容有关:
可能的解决方法:golang/go issue 28081
答案 1 :(得分:0)
很可能是Go正在使用的虚拟内存,而不是实际已提交的RAM页面。
DeferPanic博文:“Understanding Go Lang Memory Usage”(2014)