垃圾收集器如何知道對象和變量超出範圍,因此可以通過垃圾收集器收集它們?.NET中的垃圾收集器
回答
簡而言之:每個應用程序都有一組根。根標識存儲位置,這些存儲位置引用託管堆上的對象或設置爲空的對象。
當垃圾回收器開始運行時,它會假定堆中的所有對象都是垃圾。
垃圾收集器開始漫步根,並構建從根到達的所有對象的圖形。
所有對象不可達被刪除(內存被釋放)
這是從http://msdn.microsoft.com/en-us/magazine/bb985010.aspx拍攝 - 關於垃圾收集好文章。 「有趣」的部分是「垃圾收集算法」。它不是一個很長的一段
謝謝@Casper Hansen – Gunner 2012-04-04 06:27:14
不客氣:) – 2012-04-04 06:38:17
請通過http://msdn.microsoft.com/en-us/magazine/bb985010.aspx。 正如它所說的
垃圾收集器將檢查堆中是否有任何不再由應用程序使用的對象。如果存在這樣的對象,則可以回收這些對象使用的內存。
在.NET垃圾收集的任何討論將是不完整的引用Raymond Chen的優秀的系列博客文章:
- Everybody thinks about garbage collection the wrong way
- When does an object become available for garbage collection?
- Everybody thinks about CLR objects the wrong way (well not everybody)
- When do I need to use GC.KeepAlive?
下面是本系列的第一篇文章報價:
當你問別人什麼垃圾收集,你得到的答案可能會是沿着「東西線垃圾收集是自動操作環境時回收程序不再使用的內存。它通過跟蹤從根開始的內存來確定哪些對象可以訪問。「
這個描述將機制與目標混淆在一起,就像是說消防員的工作是」駕駛紅色卡車並噴灑水「。 。的消防員做什麼,但它忽略了工作點(即,撲滅火災,更普遍,消防安全)說明
而且這裏有幾個有趣的點,他證明了:
正確編寫的程序不能假定終結器將永遠運行。
在代碼塊中的叫功能的執行期間可以成爲符合回收的對象。
的參數的方法,而該方法仍在執行可以成爲符合回收。
一個怪異的真實世界的比喻:垃圾收集器能夠儘快領取您的跳水板爲潛水員接觸它最後一次 - 即使潛水員還在空中!
,最簡潔:
不要以爲GC作爲跟蹤根。把GC想象成你不再使用的東西。
- 1. .NET垃圾收集器
- 2. 垃圾收集器
- 3. 如何配置.net垃圾收集器?
- 4. C#和.Net垃圾收集器性能
- 5. ActiveX對象和.NET垃圾收集器
- 6. .NET中任務的垃圾收集
- 7. Node.js的垃圾收集器
- 8. .NET垃圾回收器
- 9. 垃圾收集
- 10. 待辦事項棧()將收集由垃圾收集器的.Net
- 11. Renderscript和垃圾收集器
- 12. 垃圾收集器閃存
- 13. 垃圾收集器asp.net
- 14. 垃圾收集器vs池
- 15. 垃圾收集器Flash Player
- 16. Jruby,垃圾收集器,Redis
- 17. SpiderMonkey垃圾收集器
- 18. bash中的垃圾收集
- 19. C#中的垃圾收集#
- 20. 如何調試.net垃圾收集?
- 21. 垃圾收集java
- 22. DoctrineCommonCache垃圾收集?
- 23. Java垃圾收集
- 24. C#垃圾收集
- 25. Java垃圾收集
- 26. WeakEvent垃圾收集
- 27. GWT垃圾收集
- 28. JAVA中的垃圾收集器sp
- 29. Ruby on Rails中的垃圾收集器?
- 30. c中的不同垃圾收集器#
你看過MSDN嗎? http://msdn.microsoft.com/en-us/library/ee787088.aspx – 2012-04-04 05:59:22