2016-03-15 108 views
3

This文章有线有关从围棋的Dropbox的开关生锈其MagicPocket产品说什么是围棋的内存占用

“内存占用”的计算机内存-the量它在运行魔术要求袖珍太高用于该公司正在试图建立的大规模存储系统。

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

+4

下面是Dropbox *实际上说的,而不是有线解释:https://news.ycombinator.com/item?id=11283688(海报是一名工程师) – elithrar

回答

4

“它有很高的内存占用”只是另一种方式说,他们的程序中使用了大量的内存。它与垃圾回收有关,因为GC'd只定期地释放内存(因为每个GC周期都需要CPU时间),而手动内存管理一旦没有使用就会或多或少地释放内存。

手动内存管理的缺点是,错误可能会导致崩溃和安全错误(如在C++中,在内存重用之后您可能意外使用释放的变量),或者必须付出努力表达的每个变量,参考等在你的代码的确切寿命,使编译器可以检查他们是在一个有效的方式使用(如铁锈,在那里你the borrow checker互动深挖的内存可能不正确的使用在你的代码)。


这句话在有线故事使它听起来像“内存占用”是,你可以分配给任何语言简单的可测量(和你的问题需要的是思路的逻辑结论)。这并不那么简单。在不同的语言中,做不同的事情会在内存,性能等方面产生不同的成本,而且您需要了解语言的“/ runtimes”细节,以了解该语言如何与特定类型的程序一起工作。

例如,CPython的具有reference counting,并且释放未使用的存储器越快,但在具有以存储和更新参考计数的成本。一方面,Java有一些东西,例如对象头文件,每个对象都会增加一定量的内存开销,但是使用一些技巧来加速Go所没有的垃圾回收(比如分代集合)。或者在Go中,您可能会尝试通过recycling memory with free pools减少程序的内存占用量,并按照kostya的说法调整GOGC以更频繁地释放未使用的内存。

更大一点没有,我列出的具体细节是超级重要,但可以有很多细节要考虑高于“内存占用”或其他“低内存占用”。


所以:“内存占用量”是指特定工作负载占用的特定程序的RAM数量。更大的图片,这是您或我或Dropbox团队等人员必须导航的大量折衷方案中的一个因素。

1

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

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

这是一般的想法,但确切的记忆,性能要求和GOGC效果是高度专用的。