背景記憶體回收

在背景記憶體回收 (GC) 中,當層代 2 的回收正在進行時,會視需要回收暫時層代 (0 和 1)。 背景記憶體回收會在一或多個專用執行緒上執行,視其為工作站或伺服器 GC 而定,並僅適用於層代 2 的回收。

預設會啟用背景記憶體回收。 您可以在 .NET Framework 應用程式中使用 gcConcurrent 組態設定,或在 .NET Core 和 .NET 5 與更新版本中啟用或停用 System.GC.Concurrent 設定。

注意

背景記憶體回收取代了並行記憶體回收,並可在 .NET Framework 4 和更新版本中使用。 在 .NET Framework 4 中,只支援將上述功能用於「工作站」記憶體回收。 從 .NET Framework 4.5 開始,背景記憶體回收可供工作站伺服器記憶體回收使用。

背景記憶體回收期間,暫時層代的回收稱為「前景」記憶體回收。 進行前景記憶體回收時,所有 Managed 執行緒都會暫停。

當背景記憶體回收正在進行,而且您已經在層代 0 中配置足夠的物件時,CLR 就會執行層代 0 或層代 1 的前景記憶體回收。 專屬的背景記憶體回收執行緒會在經常安全點檢查,以便判斷是否存在前景記憶體回收的要求。 如果有,背景回收就會自行暫停,讓前景記憶體回收能夠進行。 在前景記憶體回收完成之後,專屬的背景記憶體回收執行緒和使用者執行緒就會繼續進行。

背景記憶體回收會移除並行記憶體回收所加諸的配置限制,因為暫時記憶體回收可能會在背景記憶體回收期間進行。 背景記憶體回收可以移除暫時層代中的死物件。 在層代 1 記憶體回收期間,也可以視需要擴充堆積。

背景工作站與伺服器 GC

從 .NET Framework 4.5 開始,在伺服器 GC 中可以使用背景記憶體回收。 背景 GC 是伺服器記憶體回收的預設模式。

背景伺服器記憶體回收功能與背景工作站記憶體回收類似,但有一些差異:

  • 背景工作站記憶體回收會使用一個專用的背景記憶體回收執行緒,而背景伺服器記憶體回收則使用多個執行緒。 一般而言,每個邏輯處理器會使用一個專用的執行緒。

  • 與工作站背景記憶體回收執行緒不同的是,背景伺服器記憶體回收執行緒不會逾時。

下圖顯示在背景「工作站」上另一個專用執行緒上執行的背景記憶體回收:

Background workstation garbage collection

下圖顯示在另一個專用執行緒上執行的背景「伺服器」記憶體回收:

Background server garbage collection

並行的記憶體回收

提示

本節適用於:

  • 適用於工作站記憶體回收的 .NET Framework 3.5 和更早版本
  • 適用於伺服器記憶體回收的 .NET Framework 4 和更早版本

並行記憶體回收會由更新版本中的背景記憶體回收取代。

在工作站或伺服器記憶體回收中,您可以啟用並行記憶體回收,以便在大部分回收期間,讓執行緒以並行方式與執行記憶體回收的專屬執行緒一起執行。 這個選項只會影響層代 2 中的記憶體回收。層代 0 和 1 一律為非並行,因為其完成速度較快。

並行記憶體回收會將回收期間的暫停降到最低,藉以加快互動式應用程式的回應速度。 當並行記憶體回收執行緒正在執行時,Managed 執行緒幾乎可以繼續執行。 此設計會在記憶體回收進行時縮短暫停時間。

並行記憶體回收會針對專屬執行緒執行。 根據預設,CLR 會執行工作站記憶體回收,並在單一處理器和多處理器電腦上啟用並行記憶體回收。

下列圖例顯示在分開的專屬執行緒上執行的並行記憶體回收。

Concurrent Garbage Collection Threads

另請參閱