2010-03-22 212 views

回答

4

它採用mark and sweep algorithm。簡化版本:首先考慮所有對象符合資格收集。然後它掃描物體的根。任何有根的對象都會被標記爲正在使用中。之後所有剩餘的對象都被認爲是垃圾。 Jeffrey Richter在CLR via C#中有詳細的描述。

+0

得到了這本書,並閱讀它。非常感謝。現在非常清楚。 – devnull 2010-03-23 09:55:56

3

This文章A.亨特解釋這一切還不錯。

總之,GC以下引用查找所有不可達的對象。如果一個對象或其任何超類包含另一個對象的字段,則該對象引用另一個對象。

爲了達到這個目的,GC跟蹤四種類型的根對象,稱爲GC根。最常見的根類型是堆棧上創建的所有變量(如您猜測的那樣)。其他根類型是靜態的,互操作性的和帶有終結器方法的對象。

所以是的,GC在大多數情況下指的是堆棧。

+0

一個較小的更正 - 在堆棧上創建的所有變量都是誤導性的,「當前正在運行的方法中的局部變量被認爲是GC根,這些變量引用的對象總是可以通過它們聲明的方法立即訪問因此它們必須被保留,這些根的生命週期可以取決於程序的構建方式,在調試版本中,只要方法在堆棧上,局部變量就會持續。參考。 - http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/ – akjoshi 2012-05-24 06:56:32