一. why 爲何使用GC程序員
一、提升了軟件開發的抽象度;算法
二、程序員能夠將精力集中在實際的問題上而不用分心來管理內存的問題;數據庫
三、可使模塊的接口更加的清晰,減少模塊間的偶合;函數
四、大大減小了內存人爲管理不當所帶來的Bug;性能
五、使內存管理更加高效。優化
二 .net中的GC機制.net
限制:線程
1. GC不能釋放非託管資源。對象
2.GC並非實時的,這將會形成系統性能瓶頸和不肯定性。因此提供了IDisposable接口,程序員可使用Dispose方法顯式的釋放非託管資源。接口
GC注意事項:
一、只管理內存,非託管資源,如文件句柄,GDI資源,數據庫鏈接等還須要用戶去管理。
二、循環引用,網狀結構等的實現會變得簡單。GC的標誌-壓縮算法能有效的檢測這些關係,並將再也不被引用的網狀結構總體刪除。
三、GC經過從程序的根對象開始遍從來檢測一個對象是否可被其餘對象訪問,而不是用相似於COM中的引用計數方法。
四、GC在一個獨立的線程中運行來刪除再也不被引用的內存。
五、GC每次運行時會壓縮託管堆。
六、你必須對非託管資源的釋放負責。能夠經過在類型中定義Finalizer來保證資源獲得釋放。
七、對象的Finalizer被執行的時間是在對象再也不被引用後的某個不肯定的時間。注意並不是和C++中同樣在對象超出聲明週期時當即執行析構函數
八、Finalizer的使用有性能上的代價。須要Finalization的對象不會當即被清除,而須要先執行Finalizer.Finalizer,不是在GC執行的線程被調用。GC把每個須要執行Finalizer的對象放到一個隊列中去,而後啓動另外一個線程來執行全部這些Finalizer,而GC線程繼續去刪除其餘待回收的對象。在下一個GC週期,這些執行完Finalizer的對象的內存纔會被回收。
九、.NET GC使用"代"(generations)的概念來優化性能。代幫助GC更迅速的識別那些最可能成爲垃圾的對象。在上次執行完垃圾回收後新建立的對象爲第0代對象。經歷了一次GC週期的對象爲第1代對象。經歷了兩次或更多的GC週期的對象爲第2代對象。代的做用是爲了區分局部變量和須要在應用程序生存週期中一直存活的對象。大部分第0代對象是局部變量。成員變量和全局變量很快變成第1代對象並最終成爲第2代對象。
十、GC對不一樣代的對象執行不一樣的檢查策略以優化性能。每一個GC週期都會檢查第0代對象。大約1/10的GC週期檢查第0代和第1代對象。大約1/100的GC週期檢查全部的對象。從新思考Finalization的代價:須要Finalization的對象可能比不須要Finalization在內存中停留額外9個GC週期。若是此時它尚未被Finalize,就變成第2代對象,從而在內存中停留更長時間。