天天看點

.NET Core垃圾收集

在本章中,我們将介紹垃圾收集的概念,垃圾收集是.NET托管代碼平台最重要的特性之一。 垃圾收集器(GC)管理記憶體的配置設定和釋放。 垃圾收集器用作自動記憶體管理器。

  • 我們不需要知道如何配置設定和釋放記憶體或管理使用該記憶體的對象的生命周期
  • 每當使用

    new

    關鍵字聲明對象或将值類型裝箱時,都會進行配置設定。配置設定通常非常快。
  • 當沒有足夠的記憶體配置設定一個對象時,GC必須收集和處理垃圾記憶體以使記憶體可用于新的配置設定。

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

垃圾收集的優勢

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

  • 在開發應用程式時,不需要手動釋放記憶體。
  • 它還有效地在托管堆上配置設定對象。
  • 當對象不再使用時,它将通過清除記憶體來回收這些對象,并将記憶體保留為将來的配置設定。
  • 托管對象自動獲得幹淨的内容,是以它們的構造函數不必初始化每個資料字段。
  • 它還通過確定對象不能使用其他對象的内容來提供記憶體安全性。

垃圾收集的條件

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

  • 當系統的實體記憶體較低時。
  • 托管堆上配置設定的對象使用的記憶體超過了可接受的門檻值。該門檻值在流程運作時不斷調整。
  • GC.Collect

    方法被調用,在幾乎所有情況下,不必調用此方法,因為垃圾收集器連續運作。這種方法主要用于獨特的情況和測試。

階段過程

.NET垃圾收集器有

3

代,每一代都有自己的堆,用于存儲配置設定的對象。有一個基本的原則,判定大多數對象是短暫的還是長期的。

1. 第一代(0)

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

2. 第二代(1)

  • 在第一代,對象有第二個機會空間。
  • 代收集(通常是基于巧合的時機)下壽命很短的對象會轉到第

    1

    代。
  • 第一代集合也很快,因為它的關聯堆也很小。
  • 前兩堆仍然很小,因為對象被收集或提升到下一代堆。

3. 第三代(2)

  • 在第二代,所有的長對象都是活動的,它的堆可以長得很大。
  • 這一代的對象可以長期存活下去,沒有下一代堆積對象可以進一步推廣。
  • 垃圾收集器有一個額外的堆,用于稱為大對象堆(LOH)的大型對象。
  • 它保留

    85,000字

    節或更大的對象。
  • 大對象并沒有配置設定到代代堆,而是直接配置設定給了LOH
  • 第二代和LOH收集可能會花費很長時間運作的程式或運作大量資料的程式。
  • 已知大型伺服器程式在十幾個GB中堆積如山。
  • GC采用各種技術來減少阻止程式執行的時間。
  • 主要方法是在背景線程上盡可能多地執行垃圾回收工作,而不會幹擾程式執行。
  • GC還為開發人員提供了一些方法來影響其行為,這對提高性能非常有用。

來源:BootWiki

連結:https://www.bootwiki/netcore/dotnet_core_garbage_collection.html

著作權歸作者所有

商業轉載請聯系作者獲得授權,非商業轉載請注明出處