在大部分情況下,垃圾回收器可以判斷執行收集的最佳時間,而且您應該讓它自動執行。 強制收集可能會改善應用程式效能的情況很少見。 在這些情況下,您可以使用 GC.Collect 方法強制進行垃圾收集。
請在應用程式程式代碼中的特定位置,發生記憶體使用量大幅減少時,使用GC.Collect方法。 例如,如果您的應用程式使用具有數個控件的複雜對話框,在關閉對話框時呼叫 Collect ,可能會藉由立即回收對話框所使用的記憶體來改善效能。 請確定您的應用程式不會太頻繁地誘使垃圾收集,因為如果垃圾收集行程嘗試在非最佳時間回收物件,這可能會降低效能。 您可以提供 GCCollectionMode.Optimized 列舉值給 Collect 方法,以便只在收集具生產力時收集,如下一節所述。
GC 收集模式
您可以使用其中一個包含 GC.Collect 值的 GCCollectionMode 方法多載來指定強制集合的行為,如下所示。
GCCollectionMode 值 |
說明 |
|---|---|
| Default | 使用執行中 .NET 版本的預設垃圾收集設定。 |
| Forced | 強制立即進行垃圾收集。 這相當於呼叫 GC.Collect() 多載。 這會導致所有世代的完整封鎖集合。 在執行立即完全封鎖型垃圾回收之前,您也可以將GCSettings.LargeObjectHeapCompactionMode屬性設定為GCLargeObjectHeapCompactionMode.CompactOnce,以便壓縮大型物件堆。 |
| Optimized | 可讓垃圾收集器判斷目前的時間是否最適合回收物品。 垃圾收集器可能會判斷一次垃圾收集未具足夠的效益來證明其必要性,這種情況下將不會回收物件而直接返回。 |
背景或封鎖集合
您可以呼叫 GC.Collect(Int32, GCCollectionMode, Boolean) 方法重載來指定引發的集合是阻塞的還是非阻塞的。 執行的集合類型取決於方法與modeblocking參數的組合。
mode 是 列舉的成員 GCCollectionMode ,而 blocking 是 Boolean 值。 下表摘要說明mode和blocking參數的互動。
mode |
blocking = true |
blocking = false |
|---|---|---|
| Forced 或 Default | 會儘快執行封鎖集合。 如果背景集合正在進行中且產生為 0 或 1,則 Collect(Int32, GCCollectionMode, Boolean) 方法會立即觸發封鎖集合,並在集合完成時傳回。 如果背景集合正在進行中,而且 generation 參數為 2,方法會等到背景集合完成,觸發封鎖層 2 集合,然後傳回 。 |
收集將盡快進行。 Collect(Int32, GCCollectionMode, Boolean)方法會要求背景集合,但這並不保證;視情況而定,仍可能會執行封鎖集合。 如果背景收集程序正在進行中,方法會立即返回。 |
| Optimized | 根據垃圾收集器的狀態和 generation 參數,可能會執行阻塞集合。 垃圾收集器會嘗試提供最佳效能。 |
根據垃圾收集器的狀態,可能會執行收集動作。 Collect(Int32, GCCollectionMode, Boolean)方法會要求背景集合,但這並不保證;視情況而定,仍可能會執行封鎖集合。 垃圾收集器會嘗試提供最佳效能。 如果背景收集程序正在進行中,方法會立即返回。 |