工作站和伺服器記憶體回收

記憶體回收行程會自行調整而且可在各種案例中運作。 然而,您可以根據工作負載的特性來設定記憶體回收的類型。 CLR 會提供下列記憶體回收類型:

  • 工作站記憶體回收 (GC) 是專為用戶端應用程式所設計。 這是獨立應用程式的預設 GC 類別。 例如,針對裝載的應用程式,由 ASP.NET 裝載的應用程式,主機會決定預設的 GC 類別。

    工作站記憶體回收可能是並行或非並行的。 並行記憶體 (或背景) 回收可讓 受控執行緒在記憶體回收期間繼續運作。 從 .NET Framework 4 和更新版本起,背景記憶體回收取代了並行記憶體回收

  • 伺服器記憶體回收,適用於需要高輸送量和延展性的伺服器應用程式。

    • 在 .NET Core 中,伺服器記憶體回收可以是非並行或背景。

    • 在 .NET Framework 4.5 和更新版本中,伺服器記憶體回收可以是非並行或背景。 在 .NET Framework 4 和先前版本中,伺服器垃圾收集是非並行進行。

下圖顯示在伺服器上執行記憶體回收的專屬執行緒:

Server Garbage Collection Threads

效能考量

工作站 GC

以下是工作站記憶體回收的執行緒和效能考量:

  • 此回收會針對觸發記憶體回收的使用者執行緒進行,而且維持相同的優先權。 因為使用者執行緒通常會以一般優先權執行,所以記憶體回收行程 (在一般優先權執行緒上執行) 必須與其他執行緒爭用 CPU 時間。 (執行機器碼的執行緒不會在伺服器或工作站記憶體回收上暫停。)

  • 工作站記憶體回收一律使用於只有單一邏輯的 CPU 上,不論組態設定為何。

伺服器 GC

以下是伺服器記憶體回收的執行緒和效能考量:

  • 集合發生在多個專用執行緒上。 在 Windows 上,這些執行緒會在 THREAD_PRIORITY_HIGHEST 優先順序層級執行。

  • 執行記憶體回收的堆積和專屬執行緒是針對每個邏輯 CPU 提供的,而且這些堆積會同時回收。 每個堆積都包含小型物件堆積和大型物件堆積,而且所有堆積都可由使用者程式碼存取。 不同堆積上的物件可以彼此參考。

  • 因為多個記憶體回收執行緒會一起運作,所以就相同大小堆積而言,伺服器記憶體回收的速度比工作站記憶體回收的速度要快。

  • 伺服器記憶體回收通常具有較大的區段。 然而這只是概括而言:區段大小為實作特定,並可能隨時變更。 當微調應用程式時,不應該對記憶體回收行程所配置的區段大小做出假設。

  • 伺服器記憶體回收可能會耗用大量資源。 例如,假設有 12 個程序在具四個邏輯 CPU 的電腦上使用正在執行的伺服器 GC。 如果所有程序同時都在回收記憶體,則會互相干擾,因為相同邏輯 CPU 上排程了 12 個執行緒。 如果程序處於作用中狀態,最好讓程序全都使用伺服器 GC。

如果您正在執行數百個應用程式執行個體,請考慮使用工作站記憶體回收並停用並行記憶體回收。 這樣會產生較少的內容切換,因此可能會改善效能。

另請參閱