在 .NET 中,當您最小化程序時會呼叫垃圾收集器,這是真的嗎?
我用 C# 創建了一個程序。該程序使用了我大約 60-70 MB 的記憶體。但是當我最小化那個程序時,它需要更少的記憶體,即只有 10 MB。
當我最大化或回到那個程序時,它使用了 20 MB ……
為什麼會這樣?
當您最小化程序時,是否會呼叫垃圾收集器?
這與垃圾收集無關——這也發生在非 .NET 程序中(嘗試最小化瀏覽器,同時查看它的記憶體佔用)。
最小化程序的那一刻,Windows 作業系統將不再需要將 UI 組件保留在記憶體中,因此記憶體要求更低。
也就是說 - 當應用程序最小化時,Windows 會修剪工作集。
請參閱此channel9 執行緒和此知識庫文章(感謝@Sasha Goldshtein)。
垃圾收集器在決定執行時執行;這不一定與使用者所做的任何事情相關,當然也不會最小化應用程序。通常,您可以將其視為記憶體使用量與可用記憶體總量的函式。但關鍵是,這對作為程序員的你來說應該有些不透明。與手動記憶體管理相比,垃圾收集的最大好處是您不必擔心這些。
我從您的問題中懷疑您正在使用 Windows 任務管理器來監視應用程序的記憶體使用情況並確定何時發生垃圾收集。這是一個巨大的錯誤。如果你真的需要做記憶體分析,你需要投資一個合適的分析器。任務管理器不是為此而設計的,您經常會得到錯誤的讀取。
更具體地說,當您將應用程序最小化時,您似乎看到應用程序消耗的記憶體量顯著減少的原因只是您在嘗試使用任務管理器進行記憶體分析時會得到的錯誤讀取之一。實際情況是,每當您最小化應用程序時,Windows 核心都會自動分頁出它正在使用的大部分記憶體。您將在所有應用程序中看到這一點,而不僅僅是那些用 .NET 編寫的應用程序。因為任務管理器向您顯示實際存在的應用程序正在使用的總記憶體的子集當時的記憶體(即尚未分頁到磁碟的數量),看起來記憶體使用量實際上已經減少了。要獲得更準確的讀數,您應該查看程序的“Private Bytes”值。此知識庫文章提供了更多詳細資訊。