2012-04-04 55 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想象成你不再使用的東西。