共用方式為


System.GC 類別

本文提供此 API 參考文件的補充備註。

類別 GC 會控制垃圾收集器。 垃圾回收器是通用語言執行環境的元件,負責控制受管理的記憶體的配置和釋放。 這個類別的方法會影響物件進行垃圾回收的時間,以及釋放物件已配置的資源的時間。 此類別中的屬性提供有關系統可用記憶體總量以及分配給物件的記憶體年齡類別或代的資訊。

垃圾收集器會追蹤並回收在受控記憶體中配置的物件。 垃圾回收器會定期執行垃圾回收,以釋放那些沒有有效參考的物件所占用的記憶體。 當無法使用可用的可用記憶體滿足記憶體要求時,會自動進行垃圾收集。 或者,應用程式可以使用Collect 方法來強制垃圾回收。

垃圾收集包含下列步驟:

  1. 垃圾收集器會搜尋受控程式碼中所參考的受控物件。
  2. 垃圾收集器會嘗試清理未參考的物件。
  3. 垃圾收集行程會釋放目前未被參考的物件,並回收其記憶體。

未管理資源

在收集期間,如果垃圾收集器在受管理程式碼中找到一個或多個物件的引用,就不會釋放該物件。 不過,垃圾收集器無法識別來自非受控程式碼的對象引用,除非明確阻止這樣做,否則可能會釋放在非受控程式碼中專門使用的物件。 KeepAlive方法提供機制,可防止垃圾收集器收集非受控代碼中仍在使用的物件。

除了受管理的記憶體配置之外,垃圾收集器的實作不會維護物件持有的資源資訊,例如檔案控制代碼或資料庫連接。 當一個類型使用必須在該類型的實例被回收之前釋放的非受控資源時,該類型可以實作一個終結器。

在大部分情況下,完成項是透過覆寫Object.Finalize方法來實作;不過,以 C# 或 C++撰寫的類型會實作解構函式,編譯器會將它轉換成覆寫Object.Finalize。 在大部分情況下,如果物件有終結器,垃圾收集器會在釋放物件之前呼叫它。 不過,在所有情況下,垃圾回收器並不需要呼叫終結器;例如,SuppressFinalize 方法會明確防止呼叫物件的終結器。 此外,垃圾收集器不要求使用特定線程來對物件進行終結,或保證終結彼此參考但可供垃圾收集的物件的順序。

在特定時間必須釋放資源的情況下,類別可以實作 IDisposable 介面,其中包含 IDisposable.Dispose 方法,用於執行資源管理和清除工作。 實作Dispose的類別必須在其類別合約中明訂取用者在何時及何種情況下呼叫方法來清理物件。 根據預設,垃圾收集行程不會呼叫 Dispose 方法;不過,方法的 Dispose 實作可以呼叫 類別中的 GC 方法,以自定義垃圾收集行程的最終化行為。

如需對象最終化和處置模式的詳細資訊,請參閱 清除 Unmanaged 資源

物件老化和世代

通用語言運行環境中的垃圾回收程序支援使用世代來管理物件的年齡。 世代是記憶體中對象相對年齡的測量單位。 物件的世代號碼或存留期表示對象所屬的世代。 最近建立的物件是較新世代的一部分,且世代數目比應用程式生命週期稍早建立的對象還要少。 最近一代中的對象位於層代 0 中。 這個垃圾收集器的實作支援三個物件世代,分別是第 0 代、第 1 代和第 2 代。 您可以擷取 屬性的值 MaxGeneration ,以判斷系統所支援的最大世代數目。

物件老化允許應用程式針對特定的一組代次進行垃圾收集,而不需要垃圾收集器評估所有代次。 Collect方法的多載,其中包含generation參數,允許您指定要進行垃圾收集的最舊世代。

不允許垃圾收集

垃圾收集器支援無 GC 區域延遲模式,可在執行關鍵路徑期間,垃圾收集可能對應用程式效能造成負面影響時使用。 無 GC 區域延遲模式需要您指定一個記憶體數量,以便不受垃圾收集器的干擾進行配置。 如果執行時環境可以配置該記憶體,那麼在執行關鍵路徑中的程式碼時,執行時環境將不會進行垃圾收集。

您可以藉由呼叫TryStartNoGCRegion的其中一個多載來定義無 GC 區域的關鍵路徑之開頭。 您可以藉由呼叫 EndNoGCRegion 方法來指定其重要路徑的結尾。

您無法巢狀呼叫 TryStartNoGCRegion 方法,而且只有在運行時間目前沒有 GC 區域延遲模式時,才應該呼叫 EndNoGCRegion 方法。 換句話說,您不應該多次呼叫 TryStartNoGCRegion (在第一個方法呼叫之後,後續呼叫不會成功),而且您不應該預期呼叫 EndNoGCRegion 成功,只是因為第一次呼叫 TryStartNoGCRegion 成功。