.NET Core - 垃圾回收



本章將介紹垃圾回收的概念,這是 .NET 託管程式碼平臺最重要的功能之一。垃圾回收器 (GC) 管理記憶體的分配和釋放。垃圾回收器充當自動記憶體管理器。

  • 您無需瞭解如何分配和釋放記憶體,或管理使用該記憶體的物件的生命週期。

  • 每次使用“new”關鍵字宣告物件或值型別被裝箱時,都會進行分配。分配通常非常快。

  • 當沒有足夠的記憶體來分配物件時,GC 必須收集並處理垃圾記憶體,以便為新的分配提供記憶體。

  • 此過程稱為垃圾回收

垃圾回收的優點

垃圾回收提供以下好處:

  • 您無需在開發應用程式時手動釋放記憶體。

  • 它還在託管堆上高效地分配物件。

  • 當不再使用物件時,它將透過清除其記憶體來回收這些物件,並使記憶體可用於將來的分配。

  • 託管物件會自動獲得乾淨的內容來啟動,因此它們的建構函式不必初始化每個資料欄位。

  • 它還透過確保物件不能使用另一個物件的內容來提供記憶體安全。

垃圾回收的條件

當滿足以下條件之一時,將發生垃圾回收。

  • 系統物理記憶體不足。

  • 託管堆上已分配物件使用的記憶體超過可接受的閾值。此閾值在程序執行時會不斷調整。

  • 呼叫了GC.Collect方法,並且在幾乎所有情況下,您都不必呼叫此方法,因為垃圾回收器會持續執行。此方法主要用於獨特的情況和測試。

.NET 垃圾回收器有 3 代,每一代都有自己的堆,用於儲存已分配的物件。一個基本原則是,大多數物件要麼是短暫的,要麼是長期的。

第一代 (0)

  • 在第 0 代中,首先分配物件。

  • 在本代中,物件通常不會超過第一代,因為在下一次垃圾回收發生時,它們不再使用(超出範圍)。

  • 第 0 代收集速度很快,因為其關聯的堆很小。

第二代 (1)

  • 在第 1 代中,物件有第二次機會空間。

  • 短暫但能倖免於第 0 代收集的物件(通常基於偶然的時機)進入第 1 代。

  • 第 1 代收集速度也很快,因為其關聯的堆也很小。

  • 前兩個堆保持較小,因為物件要麼被收集,要麼被提升到下一代堆。

第三代 (2)

  • 在第 2 代中,所有長物件都存活,其堆可能會變得非常大。

  • 本代中的物件可以存活很長時間,並且沒有下一代堆來進一步提升物件。

  • 垃圾回收器還有一個用於大型物件的額外堆,稱為大物件堆 (LOH)。

  • 它保留給大小為 85,000 位元組或更大的物件。

  • 大物件不會分配給分代堆,而是直接分配給 LOH。

  • 第 2 代和 LOH 收集對於執行時間較長或處理大量資料的程式來說可能需要花費大量時間。

  • 已知大型伺服器程式的堆大小為數十 GB。

  • GC 使用各種技術來減少其阻塞程式執行的時間。

  • 主要方法是在後臺執行緒上儘可能多地執行垃圾回收工作,這樣就不會干擾程式執行。

  • GC 還提供了一些方法供開發人員影響其行為,這對於提高效能非常有用。

廣告