什么是Go的内存占用

时间:2016-03-15 01:11:25

标签: go

This有关Dropbox从Go到Rust切换其MagicPocket产品的文章说

  

“内存占用” - 运行Magic Pocket时所需的计算机内存量 - 对于该公司试图构建的海量存储系统来说太高了。

问题:Go的“内存占用”究竟是什么(它来自何处,如何测量等,它与垃圾收集,二进制大小有关,是否总是很高)以及为什么它比Rust更高吗?

2 个答案:

答案 0 :(得分:4)

"内存占用率很高"只是说他们的程序使用了大量内存的另一种方式。它与垃圾收集有关,因为GC程序只定期释放内存(因为每个GC循环占用CPU时间),而手动内存管理一旦未使用就会或多或少地释放内存。

手动内存管理的缺点是错误可能导致崩溃和安全漏洞(如在C ++中,在内存被重用于其他内容之后,您可能会意外地使用释放的变量)或者您必须付出努力来表达代码中每个变量,引用等的确切生命周期,以便编译器可以检查它们是否以有效的方式使用(如在Rust中,您与the borrow checker交互以潜在地根除代码中内存使用不正确)。

有线故事中的句子使其听起来像“记忆足迹”#34;是一个可以分配给任何语言的简单可测量数量(并且您的问题将该想法理解为其逻辑结论)。它并不那么简单。在不同的语言中,做不同的事情会在内存,性能等方面产生不同的成本,而且你必须要理解语言和/或运行时间。详细了解该语言如何与特定类型的程序一起使用。

例如,CPython有reference counting,它可以更快地释放未使用的内存,但代价是必须存储和更新引用计数。一方面,Java有像对象头一样的东西,每个对象增加了一定的内存开销,但是使用了一些技巧来加速垃圾收集(比如世代收集)Go还没有(还)。或者在Go中,您可能尝试通过recycling memory with free pools减少程序的内存占用量,并调整GOGC以更频繁地释放未使用的内存,正如kostya所说。

更重要的一点是,我列出的那些具体细节并不是非常重要,但除了“更高的内存占用”之外,还有很多细节需要考虑。或者"降低内存占用量。"

所以:"记忆足迹"指具有特定工作负载的特定程序占用的RAM量。更大的图片,它是像你或我或Dropbox的团队一样需要进行大量权衡的一个因素。

答案 1 :(得分:1)

垃圾收集器需要空闲内存才能有效工作。默认情况下,Go应用程序需要的内存大约是实时数据集大小的两倍(应用程序对象占用的内存)。

可以使用GOGC环境变量进行调整。通过将其设置为较低的值,应用程序将从操作系统请求较少的内存,但GC将更频繁地运行,因此将使用更多的CPU资源。通过将其设置为更高的值,GC将更少运行并使用更少的资源,但应用程序将具有更高的“内存占用”。

这是一般性的想法,但确切的内存,性能要求和GOGC效果是高度针对特定应用的。