2012-04-04 53 views
3

垃圾收集器如何知道对象和变量超出范围,因此可以通过垃圾收集器收集它们?.NET中的垃圾收集器

+2

你看过MSDN吗? http://msdn.microsoft.com/en-us/library/ee787088.aspx – 2012-04-04 05:59:22

回答

6

简而言之:每个应用程序都有一组根。根标识存储位置,这些存储位置引用托管堆上的对象或设置为空的对象。

当垃圾回收器开始运行时,它会假定堆中的所有对象都是垃圾。

垃圾收集器开始漫步根,并构建从根到达的所有对象的图形。

所有对象不可达被删除(内存被释放)

这是从http://msdn.microsoft.com/en-us/magazine/bb985010.aspx拍摄 - 关于垃圾收集好文章。 “有趣”的部分是“垃圾收集算法”。它不是一个很长的一段

+0

谢谢@Casper Hansen – Gunner 2012-04-04 06:27:14

+0

不客气:) – 2012-04-04 06:38:17

-4

请通过http://msdn.microsoft.com/en-us/magazine/bb985010.aspx。 正如它所说的

垃圾收集器将检查堆中是否有任何不再由应用程序使用的对象。如果存在这样的对象,则可以回收这些对象使用的内存。

+1

-1:这是怎么回答这个问题? – leppie 2012-04-04 06:01:26

+0

@leppie查看Gray的问题评论。 S. – Rauf 2012-04-04 06:02:36

+0

我没有看到任何提到的堆栈爬行,这是最基本的“答案”在这里。 – leppie 2012-04-04 06:04:00

2

在.NET垃圾收集的任何讨论将是不完整的引用Raymond Chen的优秀的系列博客文章:

下面是本系列的第一篇文章报价:

当你问别人什么垃圾收集,你得到的答案可能会是沿着“东西线垃圾收集是自动操作环境时回收程序不再使用的内存。它通过跟踪从根开始的内存来确定哪些对象可以访问。“

这个描述将机制与目标混淆在一起,就像是说消防员的工作是”驾驶红色卡车并喷洒水“。 。的消防员做什么,但它忽略了工作点(即,扑灭火灾,更普遍,消防安全)说明

而且这里有几个有趣的点,他证明了:

正确编写的程序不能假定终结器将永远运行。

 

在代码块中的叫功能的执行期间可以成为符合回收的对象。

 

的参数的方法,而该方法仍在执行可以成为符合回收

 

一个怪异的真实世界的比喻:垃圾收集器能够尽快领取您的跳水板为潜水员接触它最后一次 - 即使潜水员还在空中!

,最简洁:

不要以为GC作为跟踪根。把GC想象成你不再使用的东西。