2016-03-15 53 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效果是高度專用的。