垃圾收集器如何知道对象和变量超出范围,因此可以通过垃圾收集器收集它们?.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