.NET Core垃圾收集

在本章中,我們將介紹垃圾收集的概念,垃圾收集是.NET託管代碼平臺最重要的特性之一。 垃圾收集器(GC)管理內存的分配和釋放。 垃圾收集器用作自動內存管理器。

  • 我們不需要知道如何分配和釋放內存或管理使用該內存的對象的生命週期
  • 每當使用new關鍵字聲明對象或將值類型裝箱時,都會進行分配。分配通常非常快。
  • 當沒有足夠的內存分配一個對象時,GC必須收集和處理垃圾內存以使內存可用於新的分配。

這個過程被稱爲垃圾收集。

垃圾收集的優勢

垃圾收集提供以下好處(優勢) -

  • 在開發應用程序時,不需要手動釋放內存。
  • 它還有效地在託管堆上分配對象。
  • 當對象不再使用時,它將通過清除內存來回收這些對象,並將內存保留爲將來的分配。
  • 託管對象自動獲得乾淨的內容,所以它們的構造函數不必初始化每個數據字段。
  • 它還通過確保對象不能使用其他對象的內容來提供內存安全性。

垃圾收集的條件

垃圾收集在下列條件之一時發生:

  • 當系統的物理內存較低時。
  • 託管堆上分配的對象使用的內存超過了可接受的閾值。該閾值在流程運行時不斷調整。
  • GC.Collect方法被調用,在幾乎所有情況下,不必調用此方法,因爲垃圾收集器連續運行。這種方法主要用於獨特的情況和測試。

階段過程

.NET垃圾收集器有3代,每一代都有自己的堆,用於存儲分配的對象。有一個基本的原則,判定大多數對象是短暫的還是長期的。

1. 第一代(0)

  • 在第0代中,首先分配對象。
  • 在這一代,對象通常不會超越第一代,因爲在下一次垃圾收集時,它們不再被使用(超出範圍)。
  • 0代很快收集,因爲它相關的堆很小。

2. 第二代(1)

  • 在第一代,對象有第二個機會空間。
  • 在第0代收集(通常是基於巧合的時機)下壽命很短的對象會轉到第1代。
  • 第一代集合也很快,因爲它的關聯堆也很小。
  • 前兩堆仍然很小,因爲對象被收集或提升到下一代堆。

3. 第三代(2)

  • 在第二代,所有的長對象都是活動的,它的堆可以長得很大。
  • 這一代的對象可以長期存活下去,沒有下一代堆積對象可以進一步推廣。
  • 垃圾收集器有一個額外的堆,用於稱爲大對象堆(LOH)的大型對象。
  • 它保留85,000字節或更大的對象。
  • 大對象並沒有分配到代代堆,而是直接分配給了LOH
  • 第二代和LOH收集可能會花費很長時間運行的程序或運行大量數據的程序。
  • 已知大型服務器程序在十幾個GB中堆積如山。
  • GC採用各種技術來減少阻止程序執行的時間。
  • 主要方法是在後臺線程上儘可能多地執行垃圾回收工作,而不會干擾程序執行。
  • GC還爲開發人員提供了一些方法來影響其行爲,這對提高性能非常有用。