亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 的內存占用是多少

Go 的內存占用是多少

Go
素胚勾勒不出你 2021-12-20 19:17:22
這條有線有關的Dropbox的從轉到銹開關其MagicPocket產品說“內存占用”——運行 Magic Pocket 時所需的計算機內存量——對于公司試圖構建的海量存儲系統來說太高了。問題:Go 的“內存占用”究竟是什么(它來自哪里,它是如何測量的等等,它是否與垃圾收集、二進制大小有關,它是否總是很高的)以及為什么它更高比 Rust 的?
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

“它有很高的內存占用”只是他們的程序使用大量 RAM 的另一種說法。它與垃圾收集有關,因為 GC 的程序僅定期釋放內存(因為每個 GC 周期都需要 CPU 時間),而手動內存管理往往會在內存未使用時或多或少地釋放內存。

手動內存管理的缺點是錯誤可能導致崩潰和安全漏洞(如在 C++ 中,在內存被重用于其他用途后,您可能會意外地使用釋放的變量),或者您必須努力表達確切的生命周期代碼中的每個變量、引用等,以便編譯器可以檢查它們是否以有效方式使用(如在 Rust 中,您與借用檢查器交互以根除代碼中可能不正確使用的內存)。


連線故事中的句子聽起來像是“內存足跡”是一個簡單的可測量數量,您可以分配給任何語言(并且您的問題將這個想法推向了合乎邏輯的結論)。事情沒那么簡單。在不同的語言中,做不同的事情在內存、性能等方面有不同的成本,你必須了解語言/運行時的細節才能知道語言將如何與給定類型的程序一起工作。

例如,CPython 有引用計數,它可以更快地釋放未使用的內存,但代價是必須存儲和更新引用計數。一方面,Java 具有諸如對象標頭之類的東西,它為每個對象增加了一定數量的內存開銷,但使用了一些技巧來加速垃圾收集(如分代收集),而 Go(目前)還沒有?;蛘咴?Go 中,您可能會嘗試通過使用空閑池回收內存并調整 GOGC 以更頻繁地釋放未使用的內存來減少程序的內存占用,如 kostya 所說。

更重要的不是我列出的那些具體細節非常重要,而是除了“更高的內存占用”或“更低的內存占用”之外,還有很多細節需要考慮。


所以:“內存占用”是指具有特定工作負載的特定程序占用的 RAM 量。從更大的角度來看,這是像您或我或 Dropbox 團隊這樣的人必須進行的大量權衡中的一個因素。


查看完整回答
反對 回復 2021-12-20
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

垃圾收集器需要可用內存才能有效工作。默認情況下,Go 應用程序需要的內存大約是實時數據集大?。☉贸绦驅ο笳加玫膬却妫┑膬杀?。

這可以使用GOGC環境變量進行調整。通過將其設置為較低的值,應用程序將從操作系統請求更少的內存,但 GC 將更頻繁地運行,因此將使用更多的 CPU 資源。通過將其設置為更高的值,GC 運行的頻率將降低并使用更少的資源,但應用程序將具有更高的“內存占用”。

這是一般的想法,但確切的內存、性能要求和 GOGC 效果是高度特定于應用程序的。


查看完整回答
反對 回復 2021-12-20
  • 2 回答
  • 0 關注
  • 376 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號