.Net Framework垃圾收集具體算法詳解
.Net Framework是由微軟提供的一款基于.NET開(kāi)發(fā)的基礎(chǔ)環(huán)境。不過(guò)在這個(gè)編程平臺(tái)下,我們還可以使用其他各種語(yǔ)言來(lái)進(jìn)行代碼的編寫(xiě),大大提高了程序員的開(kāi)發(fā)效率。在這里就先來(lái)了解一下.Net Framework垃圾收集的相關(guān)算法。#t#
1..Net Framework垃圾收集只有在第0代對(duì)象充滿(mǎn)時(shí)才會(huì)出現(xiàn)。
2.每組應(yīng)用程序都有一組根,一個(gè)根是一個(gè)存儲(chǔ)位置,其中包含著一個(gè)指向引用類(lèi)型的內(nèi)存指針。同時(shí),當(dāng)JIT編譯器編譯一個(gè)方法的IL代碼時(shí),除產(chǎn)生本地CPU代碼外,JIT編譯器還會(huì)創(chuàng)建一個(gè)內(nèi)部表,該表的每個(gè)條目包含一個(gè)方法的本地CPU指令的字節(jié)偏移范圍,及該范圍中的一組包含跟的內(nèi)存地址。
3.當(dāng)垃圾收集器開(kāi)始執(zhí)行時(shí),它先假設(shè)應(yīng)用程序中沒(méi)有一個(gè)根引用著托管堆中的對(duì)象。然后,遍歷所有的根,構(gòu)造出一個(gè)包含所有可達(dá)對(duì)象的圖。任何不在該圖中的對(duì)象都將是應(yīng)用程序不可訪(fǎng)問(wèn)的對(duì)象 ,也是可以被執(zhí)行垃圾收集的對(duì)象。
為什么.Net Framework垃圾收集的功能如此強(qiáng)大,而ANSI C++沒(méi)有采用它?
這是因?yàn)槔占鞅仨毮軌蜃R(shí)別出應(yīng)用程序的根,并且還要找到所有的對(duì)象指針。非托管C++允許我們進(jìn)行類(lèi)型轉(zhuǎn)換,而無(wú)從知道它真正引用的對(duì)象是什么。在CLR中,托管堆總能知道一個(gè)對(duì)象的實(shí)際類(lèi)型,從而使其元數(shù)據(jù)信息來(lái)判斷一個(gè)對(duì)象的哪些成員引用著其他的對(duì)象。
任何封裝了非托管資源的類(lèi)型,例如文件、網(wǎng)絡(luò)鏈接、套接字、互斥體等,都必須支持一種稱(chēng)作終止化(Finalization)的操作。終止化操作允許一種資源在它所占用的內(nèi)存被回收之前首先執(zhí)行一些清理工作。
如果一個(gè)封裝了非托管資源的類(lèi)型沒(méi)有定義Finalize方法,那么這些托管資源將得不到關(guān)閉,從而導(dǎo)致某種程度的資源泄露,直到進(jìn)程結(jié)束,這些非托管資源才會(huì)被操作系統(tǒng)回收。
Finalize方法的問(wèn)題在于我們不能確定它會(huì)在何時(shí)被調(diào)用,而且它不是公有方法,因此不能顯式調(diào)用它。
我們可以通過(guò)顯示調(diào)用Dispose方法來(lái)釋放對(duì)象所封裝的非托管資源。
調(diào)用Dispose或Close方法只是在一個(gè)確定的時(shí)刻對(duì)對(duì)象占用的非托管資源執(zhí)行清理操作而已,但不會(huì)控制托管堆中對(duì)象所使用的內(nèi)存的生存期。這意味著我們?cè)谡{(diào)用過(guò)Dispose或Close方法之后,對(duì)象的內(nèi)存仍然存在,只是對(duì)象被執(zhí)行資源清理后,不能再成功執(zhí)行某些方法而已。
C#的using語(yǔ)句:編譯時(shí),編譯器會(huì)自動(dòng)產(chǎn)生一個(gè)try塊和一個(gè)finally塊,在finally塊中,編譯器會(huì)產(chǎn)生代碼將變量轉(zhuǎn)型為一個(gè)Idisposable接口,并調(diào)用其上的Dispose方法。
但我們應(yīng)謹(jǐn)慎使用C#的using語(yǔ)句,避免過(guò)早的執(zhí)行了資源清理
垃圾收集器中代齡的工作機(jī)制:CLR的托管堆支持3個(gè)代齡,但初始化時(shí),它會(huì)為這三代選擇3個(gè)閾值容量,選擇閾值容量是為了提高系統(tǒng)性能,閾值容量越大,垃圾收集執(zhí)行的頻率也就越低。
另外,CLR垃圾收集器還有一個(gè)自調(diào)節(jié)的能力,會(huì)學(xué)習(xí)應(yīng)用程序的行為,調(diào)節(jié)閾值容量,從而改變.Net Framework垃圾收集執(zhí)行的頻率,提高系統(tǒng)性能。