1. 程式人生 > >說一說垃圾回收的原理,講一下過程?

說一說垃圾回收的原理,講一下過程?

升級 遍歷 無需 情況 容量 blog 變化 變量 調用

垃圾回收:只回收托管堆中的內存資源,不回收其他資源(數據庫連接、文件句柄、網絡端口等)

什麽樣的對象才會被回收?答:沒有變量引用的對象

什麽時間回收?
系統回收,具體何時回收垃圾由系統自行確定,並不是即時執行回收的
手動調用垃圾回收器GC.Collect();,不建議使用,垃圾回收時會使程序暫停,影響程序性能

回收分為兩個階段: 標記 –> 壓縮

基本工作原理就是遍歷托管堆中的對象,標記哪些被使用對象(那些沒人使用的就是所謂的垃圾),
然後把可達對象轉移到一個連續的地址空間(也叫壓縮),其余的所有沒用的對象內存被回收掉。

技術分享

垃圾回收運行機制:
垃圾收集器將托管堆中對象分為三代:0、1和2,在CLR初始化時,會選擇為三代設置不同的闕值容量,一般為:第0代大約為256KB,第1代2MB,第2代10MB。容量越大效率越低,而GC收集器會自動調節其闕值容量來提升執行效率。在CLR初始化後,首先添加到托管堆中的對象都被定位第0代對象,當有垃圾回收執行時,未被回收的對象代齡將提升一級,變成第1代對象,而後新建對象仍未第0代對象。代齡越小表示對象越新,通常情況下其生命周期也最短,因此GC總是先收集第0代的不可達對象內存。

隨著對象的不斷創建,垃圾收集再次啟動時則只會檢查0代對象並回收0代垃圾對象。而1代對象由於未達到1代容量闕值,則不會進行垃圾回收操作,從而有效地提高了垃圾收集的效率,而這也是代齡機制在垃圾回收中的性能優化作用。當第0代對象釋放的內存不足以創建新的對象,同時1代對象的體積也超出了容量闕值是,垃圾收集器將同時對0代和1代對象進行垃圾回收。回收之後,未被回收的1代對象變化2級對象,未被回收的0代對象升級為1代對象,而後新建的對象仍為第0代對象。

finalize和dispose區別
• finalize由垃圾回收器調用;dispose由對象調用。
• finalize無需擔心因為沒有調用finalize而使非托管資源得不到釋放,而dispose必須手動調用。

• finalize雖然無需擔心因為沒有調用finalize而使非托管資源得不到釋放,但因為由垃圾回收器管理,不能保證立即釋放非托管資源;而dispose一調用便釋放非托管資源

說一說垃圾回收的原理,講一下過程?