System.GC 類別

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

類別 GC 會控制垃圾收集行程。 垃圾收集行程是通用語言執行平台元件,可控制 Managed 記憶體的配置和釋放。 這個類別中的方法會影響在對象上執行垃圾收集,以及釋放物件所配置的資源時。 此類別中的屬性會提供系統可用記憶體總數和配置給物件的記憶體存留期類別或產生的相關信息。

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

垃圾收集包含下列步驟:

  1. 垃圾收集行程會搜尋Managed程式代碼中所參考的Managed物件。
  2. 垃圾收集行程會嘗試完成未參考的物件。
  3. 垃圾收集行程會釋放未參考並回收其記憶體的物件。

非受控資源

在收集期間,如果垃圾收集行程在Managed程式碼中找到一或多個對象的參考,就不會釋放物件。 不過,垃圾收集行程無法從 Unmanaged 程式代碼辨識對象的參考,而且除非明確防止這麼做,否則可能會釋放在 Unmanaged 程式代碼中獨佔使用的物件。 KeepAlive方法提供機制,可防止垃圾收集行程收集仍在 Unmanaged 程式代碼中使用的物件。

除了 Managed 記憶體配置之外,垃圾收集行程的實作不會維護物件所持有的資源相關信息,例如檔句柄或資料庫連接。 當類型使用必須在回收類型實例之前釋放的 Unmanaged 資源時,此類型可以實作完成項。

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

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

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

物件老化和世代

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

物件過時可讓應用程式以特定一組世代為目標的垃圾收集,而不是要求垃圾收集行程評估所有世代。 Collect包含參數的方法generation多載可讓您指定要垃圾收集的最舊世代。

不允許垃圾收集

垃圾收集行程支援任何 GC 區域延遲模式,可在垃圾收集會對應用程式效能造成負面影響的重要路徑執行期間使用。 沒有 GC 區域延遲模式需要您指定可設定記憶體數量,而不會干擾垃圾收集行程。 如果運行時間可以配置該記憶體,運行時間將不會在執行重要路徑中的程式代碼時執行垃圾收集。

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

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