以更紧凑的方式分配5 GB的RAM

时间:2017-03-08 11:42:00

标签: go memory-management

我刚将一些代码从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?

2 个答案:

答案 0 :(得分:1)

谈到虚拟内存(请参见 Go Memory Management Povilas Versockas中的“ RSS vs. VSZ”),请勿尝试使用Go 1.11编写程序。

请参见golang/go issue 28114:“运行时:由1.11编译的程序分配了不合理的虚拟内存量。”
还有discussed here

可能与以下内容有关:

  • CL 85888:运行时:删除非保留堆逻辑
  • issue 10460:运行时:512G​​B内存限制

可能的解决方法:golang/go issue 28081

答案 1 :(得分:0)

很可能是Go正在使用的虚拟内存,而不是实际已提交的RAM页面。

DeferPanic博文:“Understanding Go Lang Memory Usage”(2014)