任何人都可以告訴我什麼時候垃圾收集器被叫?它是否在後臺線程中繼續運行?垃圾收集器如何知道我必須從幾代來清理內存?當CLR在.net中調用垃圾收集器?
回答
垃圾收集器未連續運行;它一次運行一個「集合」(這可能影響多個GC「世代」)。
當它被調用(忽略GC.Collect()
)是非確定性的,我相信是CLR的實現細節,而不是規範的一部分。
也就是說,當程序試圖在託管堆中分配內存並且沒有足夠的連續可用內存時,當前.NET GC將運行。該集合釋放空間並整理堆的內容,留下空間來執行分配。
Gen0集合中存在的任何內容都被提升爲Gen1;如果Gen1中沒有足夠的空間用於促銷項目,則還會收集Gen1。 Gen1和Gen2之間也是如此。
感謝您的回覆...幫助我瞭解了很多.. – Irshad
如果你想知道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!
}
}
}
類實例化本身,當它是越來越由GC完成。此外,它還會在GC啓動時打印一條消息。
垃圾收集器運行:
- 當你的代碼試圖分配內存,並沒有足夠的空間在堆上。
- 當系統嚮應用程序發送信號以嘗試使用更少的資源時(例如發生在最小化應用程序時)。
- 每當垃圾收集器認爲它會有用時,例如,如果剩餘空間不足,並且您的應用程序無論如何都忙於磁盤I/O,則可能是這種情況。
Exacly垃圾收集器如何確定它應該運行的時間是一個實現細節,因此它可以在不同的框架版本之間有所不同。
垃圾收集器不會連續運行。當它運行時,應用程序中的所有其他線程都被凍結,以便垃圾收集器可以單獨控制內存。
感謝您的回覆。 – Irshad
- 當Gen 0對象將達到〜256 KB。
- 當Gen 1對象將達到〜2Mb。
- 當Gen 2對象將達到〜10Mb。
- 系統內存不足時。
- 1. .NET垃圾收集器
- 2. 如何在CLR/.Net中記錄所有垃圾收集事件?
- 3. 瞭解垃圾收集器/ .NET的底層CLR
- 4. .NET中的垃圾收集器
- 5. 如何調試.net垃圾收集?
- 6. CLR垃圾收集局部變量在.Net
- 7. 垃圾收集器
- 8. 如何配置.net垃圾收集器?
- 9. C#和.Net垃圾收集器性能
- 10. ActiveX對象和.NET垃圾收集器
- 11. 垃圾收集器調用Dispose()?
- 12. .NET垃圾回收器
- 13. 垃圾收集和回調
- 14. CLR垃圾收集器頻率和系統內存可用
- 15. 垃圾收集
- 16. .NET中任務的垃圾收集
- 17. Renderscript和垃圾收集器
- 18. 垃圾收集器閃存
- 19. 垃圾收集器asp.net
- 20. Node.js的垃圾收集器
- 21. 垃圾收集器vs池
- 22. 垃圾收集器Flash Player
- 23. Jruby,垃圾收集器,Redis
- 24. SpiderMonkey垃圾收集器
- 25. 待辦事項棧()將收集由垃圾收集器的.Net
- 26. 在C中監視垃圾收集器#
- 27. 垃圾收集java
- 28. DoctrineCommonCache垃圾收集?
- 29. Java垃圾收集
- 30. C#垃圾收集
http://msdn.microsoft.com/en-us/library/ee787088.aspx –
當它被調用取決於一些事情。微軟在垃圾收集器上有很好的文檔:http://msdn.microsoft。COM/EN-US /庫/ 0xy59wtx.aspx。 – alexn