2010-04-24 66 views
2

我知道不可能知道什麼時候發生GC,但有些因素會告訴您發生的頻率/時間。這些是什麼因素?一個是有多少個對象被創建,當滿足下列條件之一爲真發生等什麼影響GC的時間?

+0

我不知道你的問題的答案,但我只想指出,有幾個GC的實現。我知道三個:工作站,服務器和壓縮。另外,如果你走向異國情調,Singularity項目有五個類似的東西。 – 2010-04-24 00:08:17

+0

當然還有Mono,Portable.NET,.NET Compact Framework,Rotor ... – 2010-04-24 03:45:02

回答

4

簡短的回答是,以下事件會觸發一個採集週期:

分配超過GEN0門檻

收集特定代時到產生內存閾值被擊中發生。在.NET版本1.0的實現中,世代0,1和2的初始閾值分別是256千字節(KB),2兆字節(MB)和10 MB。請注意,GC可以根據應用程序的分配模式動態調整這些閾值。大於85 KB的對象會自動放入大對象堆中。

System.GC.Collect()被稱爲

分配只在GEN0發生。每次GC後,Gen0都是空的。新的分配將填滿Gen0,下一個GC將會發生,依此類推。手動調用GC.Collect()的問題在於,最終可能會比預期的更頻繁地調用它(因爲CLR會調用它),並且性能會下降,因爲您提前觸發GC循環。

系統是在內存不足的情況

這是由這意味着你真的有超過它不是確保您在流程和組件正確地清理資源等無法控制的系統上的其他進程的影響。

+0

這些是我在另一個網站上看到的並且被遺忘的因素。謝謝。 – dotnetdev 2010-04-26 13:22:00

1

垃圾收集:

該系統具有低的物理內存。

託管堆上分配的對象使用的內存超過可接受的閾值。這意味着託管堆已超出可接受的內存使用量閾值。隨着流程運行,此閾值將不斷調整。

GC.Collect方法被調用。在幾乎所有情況下,您都不必調用此方法,因爲垃圾收集器連續運行。此方法主要用於獨特的情況和測試。

0

對於桌面版C#有幾個因素:

  • 內存分配(每次1 MB被分配一個GC水平1被觸發)
  • 系統內存壓力的金額(如金額物理內存空間不足,GC可能被觸發)
  • 虛擬內存提交(如果系統要對提交內存頁面,則GC可在操作之前)
  • 綱領性從代碼觸發觸發。
  • GC可以使用其他啓發式來觸發集合。

如果您有興趣在3級集合即將發生.Net框架3。0和以上有GC通知,你可以訂閱,在它們發生之前得到通知:RegisterForFullGCNotification

+0

我相信,如果您使用Server GC而不是Workstation GC,這是桌面應用程序的默認設置,則只能使用'RegistorForFullGCNotification'。 – 2010-04-24 00:17:14

+0

@Scott Dorman,您可以註冊任何類型的GC。 – 2010-04-24 00:19:29

+0

對不起......檢查此頁以獲取更多詳細信息:http://msdn.microsoft.com/en-us/library/cc713687.aspx'此功能僅在禁用併發垃圾收集時可用。默認情況下,除非您在託管環境中運行並且主機爲您更改了配置,否則將啓用併發垃圾收集。「# – 2010-04-24 00:22:42

相關問題