延遲模式
為回收物件,記憶體回收行程必須停止應用程式所有執行中的執行緒。 在某些情況下,例如當應用程式擷取資料或顯示內容時,可能會在關鍵時間執行完整記憶體回收,使效能受到影響。 您可以將 GCSettings.LatencyMode 屬性設為 System.Runtime.GCLatencyMode 的其中一個值,以調整記憶體回收行程的干擾程度。
延遲指的是記憶體回收行程干擾應用程式的時間。 在低延遲期間,記憶體回收行程在回收物件時較為保守,干擾程度較低。 我們建議只有在短時間需要時才使用 GCLatencyMode.LowLatency 模式。 否則,如果系統處於記憶體壓力下,記憶體回收行程會觸發回收,這可能會短時間暫停應用程式,而中斷了時間關鍵的作業。
在低延遲期間,除非發生下列情況,否則將抑制層代 2 回收:
系統從作業系統收到記憶體不足的通知。
您的應用程式程式碼呼叫 GC.Collect 方法並針對 generation 參數指定 2,藉以誘發回收。
該延遲模式適用的應用程式應為,其中包含短時間執行且必須在執行階段盡可能不中斷執行的程式碼區塊。 雖然 LowLatency 模式是設計用於有某些時間限制的案例,但這並不適合有嚴格即時限制的案例。
下表列出 GCLatencyMode 值所適用的應用程式案例。
延遲模式 |
應用程式案例 |
---|---|
適合沒有 UI 或伺服器端作業的應用程式。 |
|
適合有 UI 的大多數應用程式。 |
|
適合有短時間且時間關鍵作業的應用程式,這些作業一旦被記憶體回收行程中斷就會受到干擾。 例如,呈現動畫或擷取資料的應用程式。 |
預設記憶體回收模式
如果未指定 LatencyMode 屬性,預設模式便是並行工作站記憶體回收。 此模式取決於兩個執行階段組態設定的值:
-
如果已啟用,則此設定會指定 Common Language Runtime 在不同執行緒上執行工作站記憶體回收,以支援並行作業。 此設定預設為啟用。
-
如果已啟用,則此設定會指定 Common Language Runtime 執行伺服器記憶體回收,否則便執行工作站記憶體回收。 您只能在有兩個以上處理器的電腦上啟用伺服器記憶體回收。 它預設未啟用。
如果已啟用此設定,則 <gcConcurrent> 會自動停用。
GCLatencyMode 的預設值如下:
當 <gcConcurrent> 已啟用且 <gcServer> 已停用時,則為 Interactive。
當 <gcConcurrent> 已停用且 <gcServer> 已啟用時,則為 Batch。
注意事項 |
---|
在實作 Intel Itanium 架構 (之前稱為 IA-64) 的 64 位元系統中,執行 WOW64 x86 模擬器的應用程式並不支援並行記憶體回收。 |
使用低延遲的方針
使用 LowLatency 模式時,請考慮下列方針:
盡可能縮短低延遲的時間長度。
避免在低延遲期間配置大量記憶體。 由於記憶體回收會回收較少的物件,因此可能會發出記憶體不足通知。
在低延遲模式中,將您所做的配置數減至最少,特別是配置到大型物件堆積和 Pin 物件。
請注意可能進行配置的執行緒。 由於 LatencyMode 屬性設定適用於整個處理序,您可以在任何可能進行配置的執行緒上產生 OutOfMemoryException。
將低延遲程式碼包裝在限制的執行區域內 (如需詳細資訊,請參閱限制的執行區域)。
您可以藉由呼叫 GC.Collect(Int32, GCCollectionMode) 方法,在低延遲期間強制執行層代 2 回收。