延遲模式

為了回收物件,記憶體回收行程 (GC) 必須停止應用程式中所有正在執行的執行緒。 記憶體回收行程處於作用中狀態的時段稱為其延遲

在某些情況下,例如當應用程式擷取資料或顯示內容時,完整記憶體回收會在關鍵時刻進行,而妨礙效能。 您可以藉由設定 GCSettings.LatencyMode 屬性為 System.Runtime.GCLatencyMode 值的其中一個,來調整記憶體回收行程的干擾程度。

低延遲設定

使用「低」延遲設定表示記憶體回收行程在應用程式中干擾較少。 記憶體回收在回收記憶體方面更為保守。

System.Runtime.GCLatencyMode 列舉會提供兩個低延遲設定:

  • GCLatencyMode.LowLatency 會隱藏層代 2 回收,並且只執行層代 0 和 1 回收。 它只適合短時間使用。 經過一段較長的時間後,如果系統記憶體吃緊,則記憶體回收行程將會觸發回收,該回收可能會短暫暫停應用程式,並且中斷時間關鍵的作業。 這項設定僅適用於工作站記憶體回收。

  • GCLatencyMode.SustainedLowLatency 會隱藏前景層代 2 回收,並且只執行層代 0、1 和背景層代 2 回收。 它可以長時間使用,並且可用於工作站和伺服器記憶體回收。 如果已停用背景記憶體回收,則無法使用這個設定。

在低延遲期間,會隱藏層代 2 回收,除非發生下列情況:

  • 系統從作業系統接收到記憶體不足的通知。

  • 應用程式程式碼會呼叫 GC.Collect 方法並指定 generation 參數為 2 來進行回收。

案例

下表列出使用 GCLatencyMode 值的應用程式情節:

延遲模式 應用程式案例
Batch 對於沒有使用者介面 (UI) 或伺服器端作業的應用程式。

停用背景記憶體回收時,這是工作站和伺服器記憶體回收的預設模式。 Batch 模式也會覆寫 gcConcurrent 設定,亦即它會防止背景或並行收集。
Interactive 對於大部分有使用者介面的應用程式,

這是工作站和伺服器記憶體回收的預設模式。 不過,如果裝載了應用程式,則裝載程序的記憶體回收行程設定會優先採用。
LowLatency 對於具有短期、對時間敏感作業的應用程式,其執行期間可能受到記憶體回收行程中斷的干擾。 例如,呈現動畫或資料擷取功能的應用程式。
SustainedLowLatency 適合的應用程式具有對時間敏感的作業,這些作業可能長時間持續執行,且這段執行時間內可能經常受到記憶體回收行程中斷的干擾。 例如,因為交易時間內市場資料不斷變化,而需要迅速回應的應用程式。

這個模式會所產生的 Managed 堆積大小會比其他模式更大。 由於它不會壓縮 Managed 堆積,因此磁碟可能會高度分割。 確定有足夠的記憶體可供使用。

使用低延遲的指導方針

當您使用 GCLatencyMode.LowLatency 模式時,請考慮下列指導方針:

  • 盡可能縮短這段低延遲的時間。

  • 請避免在低延遲期間配置大量記憶體。 因為記憶體回收較少物件時,會造成記憶體不足的通知。

  • 在低延遲模式下時,請盡量減少新配置的數目,特別是對大型物件堆積和固定物件的配置。

  • 請注意無法配置的執行緒。 因為 LatencyMode 屬性設定為整個處理程序範圍,所以可能會在任何正在配置的執行緒上產生 OutOfMemoryException 例外狀況。

  • 將低延遲程式碼包裝在限制的執行區域中。 如需詳細資訊,請參閱限制的執行區域

  • 您也可以呼叫 GC.Collect(Int32, GCCollectionMode) 方法,在低延遲期間強制層代 2 回收。

另請參閱