.NET垃圾回收機(jī)制知識(shí)點(diǎn)整理
1. .NET資源分托管資源和非托管資源,對(duì)于托管資源,.NET GC可以很好的回收無用的垃圾,而對(duì)于非托管(例如文件訪問,網(wǎng)絡(luò)訪問等)需要手動(dòng)清理垃圾(顯式釋放)。
2. 非托管資源的釋放,.NET提供了兩種方式:
1).Finalizer:寫法貌似C++的析構(gòu)函數(shù),本質(zhì)上卻相差甚遠(yuǎn)。Finalizer是對(duì)象被GC回收之前調(diào)用的終結(jié)器,初衷是在這里釋放非托管資源,但由于GC運(yùn)行時(shí)機(jī)的不確定性,通常會(huì)導(dǎo)致非托管資源釋放不及時(shí)。另外,F(xiàn)inalizer可能還會(huì)有意想不到的副作用,比如:被回收的對(duì)象已經(jīng)沒有被其他可用對(duì)象所引用,但Finalizer內(nèi)部卻把它重新變成可用,這就破壞了GC垃圾收集過程的原子性,增大了GC開銷。
2).Dispose模式:C#提供using關(guān)鍵字支持Dispose Pattern進(jìn)行資源釋放。這樣能通過確定的方式釋放非托管資源,而且using結(jié)構(gòu)提供了異常安全性。所以,一般建議采用Dispose Pattern,并在Finalizer中輔以檢查,如果忘記顯式Dispose對(duì)象則在Finalizer中釋放資源。
3. 托管資源的回收,判斷對(duì)象是否要被回收只要判定此對(duì)象或者其包含的子對(duì)象沒有任何引用是有效的
4. GC的代價(jià):一則喪失了托管資源回收的實(shí)時(shí)性,二是沒有把C#托管資源和非托管資源的管理統(tǒng)一起來,造成概念割裂
5. .NET類型分兩大類:引用類型、值類型,值類型分配在棧上,不需要GC回收;引用類型分配在堆上,它的釋放和回收需要GC來完成。一個(gè)引用類型的對(duì)象要被回收,需要要成為垃圾
6. 系統(tǒng)為GC安排了獨(dú)立線程,對(duì)于內(nèi)存回收GC采取了一定的優(yōu)先算法進(jìn)行輪循回收內(nèi)存資源
7. Generation(代),為了提高性能,越老的對(duì)象存活的越久。.NET中一般分為三代,G0,G1,G2;G0***被回收。
8. 垃圾回收的步驟,標(biāo)記->整理->終結(jié)
9. GC.Collect()一般要和GC.SuppressFinalize函數(shù)配合使用,使用GC.SuppressFinalize函數(shù),防止清理沖突。
原文鏈接:http://www.cnblogs.com/myangel/archive/2011/12/24/2300207.html
【編輯推薦】