2 回答

TA貢獻1848條經驗 獲得超2個贊
“它有很高的內存占用”只是他們的程序使用大量 RAM 的另一種說法。它與垃圾收集有關,因為 GC 的程序僅定期釋放內存(因為每個 GC 周期都需要 CPU 時間),而手動內存管理往往會在內存未使用時或多或少地釋放內存。
手動內存管理的缺點是錯誤可能導致崩潰和安全漏洞(如在 C++ 中,在內存被重用于其他用途后,您可能會意外地使用釋放的變量),或者您必須努力表達確切的生命周期代碼中的每個變量、引用等,以便編譯器可以檢查它們是否以有效方式使用(如在 Rust 中,您與借用檢查器交互以根除代碼中可能不正確使用的內存)。
連線故事中的句子聽起來像是“內存足跡”是一個簡單的可測量數量,您可以分配給任何語言(并且您的問題將這個想法推向了合乎邏輯的結論)。事情沒那么簡單。在不同的語言中,做不同的事情在內存、性能等方面有不同的成本,你必須了解語言/運行時的細節才能知道語言將如何與給定類型的程序一起工作。
例如,CPython 有引用計數,它可以更快地釋放未使用的內存,但代價是必須存儲和更新引用計數。一方面,Java 具有諸如對象標頭之類的東西,它為每個對象增加了一定數量的內存開銷,但使用了一些技巧來加速垃圾收集(如分代收集),而 Go(目前)還沒有?;蛘咴?Go 中,您可能會嘗試通過使用空閑池回收內存并調整 GOGC 以更頻繁地釋放未使用的內存來減少程序的內存占用,如 kostya 所說。
更重要的不是我列出的那些具體細節非常重要,而是除了“更高的內存占用”或“更低的內存占用”之外,還有很多細節需要考慮。
所以:“內存占用”是指具有特定工作負載的特定程序占用的 RAM 量。從更大的角度來看,這是像您或我或 Dropbox 團隊這樣的人必須進行的大量權衡中的一個因素。

TA貢獻1876條經驗 獲得超6個贊
垃圾收集器需要可用內存才能有效工作。默認情況下,Go 應用程序需要的內存大約是實時數據集大?。☉贸绦驅ο笳加玫膬却妫┑膬杀?。
這可以使用GOGC
環境變量進行調整。通過將其設置為較低的值,應用程序將從操作系統請求更少的內存,但 GC 將更頻繁地運行,因此將使用更多的 CPU 資源。通過將其設置為更高的值,GC 運行的頻率將降低并使用更少的資源,但應用程序將具有更高的“內存占用”。
這是一般的想法,但確切的內存、性能要求和 GOGC 效果是高度特定于應用程序的。
- 2 回答
- 0 關注
- 376 瀏覽
添加回答
舉報