垃圾回收機制

這個是.net底層知識非常重要的一個部分。垃圾回收器負責堆區的管理工作,非常複雜,我只是淺顯講講他是如何回收對象的。

首先,垃圾回收器的對象分爲三個等級:012。0級對象生存週期最短,1級較長,2級最長。對象在最開始被創建的時候都是被標記爲0級對象,如果在它被創建後的第一次垃圾回收後,他仍然存活,那麼它將被晉升爲1級對象,接着如果還能存活就會被晉升爲2級對象。對對象實行分級處理對於垃圾回收機制是非常重要的!因爲這能極大提高它的效率。下面,我將講述垃圾回收器是如何決定回收哪個對象的。(補充:垃圾回收期內部有幾張表,我先介紹一個,對象與根的對照表,這個表一個字段是堆區所有對象,一個字段是在棧區指向堆區的根,強引用)

首先明確的是垃圾回收器什麼時候回收對象是未知的,它的內部有自己的算法(垃圾算法?^_^),當託管堆中內存緊張了,垃圾回收器就要執行回收。據參考資料(.net框架一書)講,當0級對象區域滿了的話,就會執行垃圾回收。執行開始時,它會先去查看對象表,看哪個對象沒有被強引用着的,如果沒有被強引用,垃圾回收器就會考慮回收!記住只是考慮回收,這裏牽涉到強引用,弱引用和對象復甦的概念,以後會講到。gc在0級回收區域如果能得到想要的內存,那就開始執行回收,但是如果0級對象都被強引用或者0級對象區域可回收對象的內存不能滿足下個對象創建所需內存,那麼gc就會接着考慮1級對象區域的可回收對象(即沒有被強引用着的)。當垃圾回收器決定哪些要回收了,就會把那些對象所佔用的區域恢復爲初始狀態,並且還有一個非常重要的步驟,整理壓縮堆區。忘了補充一個非常重要的一點:當垃圾回收器執行回收時,所有的進程(除垃圾回收進程)都會處於掛起狀態。整理堆區就是當gc把那些回收對象內存全釋放後,把其他對象全部壓縮到一塊,放在堆頭,然後,剩下的堆區就是一塊完整的內存區域。(爲什麼要完整地堆區我就不廢話了)然後把那些對象的新地址再重新複製給他們的強引用。最後完成回收工作。大功告成!

 
發佈了47 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章