2009-07-22 105 views

回答

2

GC僅在堆滿時發生。 當垃圾收集器啓動 運行時,它會假定堆中的所有對象都是垃圾。 換句話說,它假設應用程序的根沒有任何 指向堆中的任何對象 。現在, 垃圾收集器開始步行 根,並構建從根到達的所有對象的圖形。例如,對於 示例,垃圾收集器可能會在 中找到一個全局變量,該變量指向堆中對象的 。

下圖顯示了幾個 分配的對象,其中 應用根1直接引用 對象OBJ1,OBJ2和應用 根2指OBJ4和obj5堆。這些對象全部爲 圖的一部分。當添加對象Obj2的 應用程序根目錄1時,收集程序 注意到此對象指的是 對象Obj7也被添加到 圖中。收集器繼續通過所有可到達對象 遞歸地步行 。

alt text http://www.c-sharpcorner.com/UploadFile/ankithakur/GCAlgorithm12222005224854PM/Images/GC.gif

...續here

這裏有一對夫婦的其他鏈接,讓你在垃圾收集閱讀:

1

這是GC的基本思路。

==========================================

每個應用程序都有一組根。根標識存儲位置,這些存儲位置引用託管堆上的對象或設置爲空的對象。

例如:

- 應用程序中的所有全局和靜態對象指針。 - 線程堆棧上的任何本地變量/參數對象指針。 - 包含指向託管堆中對象的指針的任何CPU寄存器。 - 指針從Freachable隊列

積極根的名單是由剛剛在時間(JIT)編譯器和公共語言運行庫維護,由垃圾回收算法訪問的對象