2012-10-26 85 views
4

任何人都可以告訴我什麼時候垃圾收集器被叫?它是否在後臺線程中繼續運行?垃圾收集器如何知道我必須從幾代來清理內存?當CLR在.net中調用垃圾收集器?

+1

http://msdn.microsoft.com/en-us/library/ee787088.aspx –

+2

當它被調用取決於一些事情。微軟在垃圾收集器上有很好的文檔:http://msdn.microsoft。COM/EN-US /庫/ 0xy59wtx.aspx。 – alexn

回答

1

垃圾收集器未連續運行;它一次運行一個「集合」(這可能影響多個GC「世代」)。

當它被調用(忽略GC.Collect())是非確定性的,我相信是CLR的實現細節,而不是規範的一部分。

也就是說,當程序試圖在託管堆中分配內存並且沒有足夠的連續可用內存時,當前.NET GC將運行。該集合釋放空間並整理堆的內容,留下空間來執行分配。

Gen0集合中存在的任何內容都被提升爲Gen1;如果Gen1中沒有足夠的空間用於促銷項目,則還會收集Gen1。 Gen1和Gen2之間也是如此。

+0

感謝您的回覆...幫助我瞭解了很多.. – Irshad

3

如果你想知道exaclty若GC收集,你可以使用這個類:

public class GCWatcher 
{ 
    protected override void Finalize() 
    { 
     Debug.Print("GC on the prowl"); 
     try { 
      if (!AppDomain.CurrentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted) { 
       GCWatcher g = new GCWatcher(); 
      } 
     } catch { 
      // nothing to do, but in case of error, the GC should continue anyway! 
     } 
    } 
} 

Source

類實例化本身,當它是越來越由GC完成。此外,它還會在GC啓動時打印一條消息。

此外,您還可以查看評論中發佈的鏈接,深入瞭解.NET GC herehere

2

垃圾收集器運行:

  • 當你的代碼試圖分配內存,並沒有足夠的空間在堆上。
  • 當系統嚮應用程序發送信號以嘗試使用更少的資源時(例如發生在最小化應用程序時)。
  • 每當垃圾收集器認爲它會有用時,例如,如果剩餘空間不足,並且您的應用程序無論如何都忙於磁盤I/O,則可能是這種情況。

Exacly垃圾收集器如何確定它應該運行的時間是一個實現細節,因此它可以在不同的框架版本之間有所不同。

垃圾收集器不會連續運行。當它運行時,應用程序中的所有其他線程都被凍結,以便垃圾收集器可以單獨控制內存。

+0

感謝您的回覆。 – Irshad

0
  • 當Gen 0對象將達到〜256 KB。
  • 當Gen 1對象將達到〜2Mb。
  • 當Gen 2對象將達到〜10Mb。
  • 系統內存不足時。