人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

漫談.Net中的自動垃圾收集(Garbage Collection)機制(轉)

漫談.Net中的自動垃圾收集(Garbage Collection)機制(轉)

更新時間:2022-07-12 文章作者:未知 信息來源:網絡 閱讀次數:

作者:cornfield
漫談.Net中的自動垃圾收集(Garbage Collection)機制
一直以來,垃圾收集(Garbage Collection)在軟件界的名聲并不好。很多程序員認為垃圾收集做得不如自己來的直接,高效。這種說法有些時候是對的,一個精心為自己的特定程序設計定制的內存回收方法,肯定比為所有程序提供垃圾回收性能要高。但那對程序員要求甚高,一個項目下來花在內存回收的設計上的時間和精力是很可觀的,而稍有不慎便會釀成災難性的錯誤,技術再高超的程序員負擔不起,整個現代軟件工業也負擔不起。把這樣普遍而又繁重的任務交給系統處理,將程序員從中解脫出來專注于事務邏輯和系統功能的實現,已經成為軟件業的共識。微軟新推出的.Net平臺架構便引入了自動垃圾回收機制,本文將詳細解剖其中的原理,回答諸如垃圾回收怎樣工作?怎樣控制垃圾回收?什么時候需要控制垃圾回收?什么又是垃圾回收不能解決的?等等重要問題,為.Net平臺下的系統開發人員提供設計時的參考。
要搞清楚.Net 運行時的垃圾回收機制,首先需要搞清楚.Net運行時內存分配的情況。.Net 運行時對受管資源(Managed Resource)采用對象引用的堆式分配(Heap Allocation)方法。這種分配方法大多數時候是非常快的。一個實際系統的內存總是有限的,當系統的剩余的可分配的內存資源不多時,.Net 運行時便會“預見”到下面的內存資源將可能不會滿足下面的內存分配請求,于是它便會開始執行垃圾回收釋放那些系統不再引用的內存資源。.Net垃圾回收器采用的是一種叫做“標志緊縮”(Mark and Compat)的算法。每當垃圾收集開始,.Net垃圾收集器從運行時目前的根對象(包括全局對象,本地對象,靜態對象,CPU寄存器對象),開始尋找那些被根對象引用的所有對象,這些對象便是在垃圾收集時運行時正在應用的對象,除去這些,其他的受管運行時對象(Managed Runtime Object)便是系統不再使用的對象,于是便可以進行垃圾收集。所有引用的對象被向下拷貝到運行時受管堆(Runtime Managed Heap),同時修改它們的引用指針。需要指出的是,在.Net垃圾收集器移動引用對象和改變引用指針時,系統不能在這些對象上有任何操作,這一點由運行時的互斥機制來保證,無需程序員干涉。
遍歷目前所有被引對象的耗費往往是巨大的,實際上也不必這樣做。一個經驗的認識是,當一個對象在內存中駐留的時間越長,那么它越有可能繼續被引用留在內存中。相反,一個對象在內存中駐留時間越短,它越有可能被收集。.Net收集器采用一種稱作“代分”(Generation Division)的方法來體現這種經驗的內存駐留理論。它把受管堆中的對象分成三代(Generations). 第一代是沒有經歷過垃圾收集駐留在內存中的對象,他們通常是一些局部變量,它們的生命最短。第二代是僅經歷過一次垃圾收集仍然駐留在內存中的對象,它們通常是一些如表單,列表,按鈕等生命較短的對象。第三代是經歷過兩次及兩次以上的垃圾收集后仍然駐留在內存中的對象,它們通常是一些應用程序對象,它們往往要在內存中駐留很長時間。當運行時收集器開始執行垃圾收集時,它首先對第一代對象進行垃圾收集,這通常會釋放較大的內存空間,往往會滿足下面的內存請求。如果這一代的收集結果不理想,那么便會對第二代讀像進行收集,同樣如果還不理想,便進行第三代的垃圾收集。
.Net垃圾回收機制支持一種稱作終止化(Finalizaion)的概念。這有點類似C++中的析構函數。終止化操作在垃圾收集執行后進行一些非受管資源的清除工作,它在.Net運行時里有很多限制,往往不被推薦實現。當程序員對一個對象實現了終止器(Finalizer)后,運行時便會將這個對象的引用加入一個稱作終止化對象引用集的鏈表,作為要求終止化的標志。當垃圾收集開始時,若一個對象不再被引用但它被加入了終止化對象引用集的鏈表,那么運行時將此對象標志為要求終止化操作對象。待垃圾收集完成后,終止化線程便會被運行時喚醒執行終止化操作。顯然這之后要從終止化對象引用集的鏈表中將之刪去。容易看出來,終止化操作會給系統帶來額外的開銷。終止化是通過啟用線程機制來實現的,這有一個線程安全的問題。.Net運行時不能保證終止化執行的順序,也就是說如果對象A有一個指向對象B的引用,兩個對象都有終止化操作,但對象A在終止化操作時并不一定有有效的對象A引用。所以.Net運行時不推薦對對象進行終止化操作,只是在有非受管資源如數據庫的連接,文件的打開等需要嚴格釋放時,才應用終止化操作。
 大多數時候,垃圾收集應該交由.Net運行時來控制,但有些時候,可能需要人為地控制一下垃圾回收操作。例如在操作了一次大規模的對象集合后,我們確信不再在這些對象上進行任何的操作了,那我們可以強制垃圾回收立即執行,這通過調用System.GC.Collect() 方法即可實現,但頻繁的收集會顯著地降低系統的性能。還有一種情況,已經將一個對象放到了終止化對象引用集的鏈上了,但如果我們在程序中某些地方已經做了終止化的操作,在那之后便可以通過調用System.GC.SupressFinalize()來將對象的引用從終止化對象引用集鏈上摘掉,以忽略終止化操作。始終應該清楚的是,終止化操作的系統負擔是很重的。
綜上所述,.Net垃圾回收機制負責回收系統不再使用的受管內存資源,它通過一定的優化算法來選擇收集的對象和時間。程序員只有在釋放大量受管資源時可以進行立即強制垃圾收集,在釋放非受管資源時采用終止化操作來處理,其它時間將資源的回收交由.Net垃圾收集起來做。
希望廣大網友多多

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 平邑县| 桂林市| 隆回县| 湾仔区| 集安市| 岳阳市| 湖口县| 宣城市| 勃利县| 德阳市| 尉氏县| 福海县| 无棣县| 英德市| 凌源市| 岳阳县| 彝良县| 德化县| 常州市| 峨山| 大洼县| 罗田县| 古丈县| 临汾市| 全椒县| 论坛| 永清县| 阿拉善左旗| 合作市| 确山县| 虹口区| 时尚| 松滋市| 永春县| 浦东新区| 荣成市| 若尔盖县| 达孜县| 固安县| 武夷山市| 青海省|