轉(zhuǎn)載自【雨聲論壇】 原作:software_young
----------------------轉(zhuǎn)載開始------------------------ 所謂垃圾回收機(jī)制,指的是內(nèi)存和各種變量或者目標(biāo)所使用內(nèi)存的釋放和回收機(jī)制。
軟件的發(fā)展歷史,就是軟件不斷龐大、人力逐漸難以控制和對(duì)開發(fā)人員的技術(shù)要求逐漸降低的歷史。
早先的許多軟件,都是用匯編語(yǔ)言寫的,匯編是機(jī)器碼的助記符方式,因此,用匯編編程,實(shí)際就是用機(jī)器碼編程。它要求程序員對(duì)機(jī)器非常熟悉才行,否則很難編出能用的程序。
那時(shí)候的程序員首先要是鐵算盤,需要對(duì)機(jī)器的運(yùn)行狀態(tài)完全成竹在胸,腦子里對(duì)CPU的各個(gè)寄存器的值,狀態(tài)寄存器的狀態(tài),棧內(nèi)的BP、SP,內(nèi)存的分配和釋放以及其他一些東西非常清楚才行。他掌握了機(jī)器(哪怕只是虛擬機(jī))的全部資源的使用和釋放,因此那時(shí)候,沒有所謂的垃圾回收機(jī)制。程序員可以說就是高級(jí)機(jī)器人,他管理一切。
隨著軟件技術(shù)的發(fā)展,高級(jí)語(yǔ)言開始出現(xiàn),軟件也逐漸變得龐大起來,主要的高級(jí)語(yǔ)言都有了專門用于分配和釋放內(nèi)存和變量、目標(biāo)(對(duì)于面向目標(biāo)的編程語(yǔ)言來說)的函數(shù)或者功能。
程序員用它們來負(fù)責(zé)內(nèi)存的分配和釋放。但是逐漸地,高級(jí)機(jī)器人也感到難以應(yīng)付了,于是出現(xiàn)了內(nèi)存丟失的問題,就是內(nèi)存分配后忘記釋放了。
一般來說,操作系統(tǒng)記錄了進(jìn)程所使用的資源,在進(jìn)程結(jié)束時(shí)釋放這些資源。但是如果進(jìn)程運(yùn)行的時(shí)間很長(zhǎng),或者永不結(jié)束(主機(jī)和小型機(jī)經(jīng)常是常年運(yùn)行的),操作系統(tǒng)就沒有機(jī)會(huì)來及時(shí)地釋放這些資源,從而造成系統(tǒng)內(nèi)存的丟失。系統(tǒng)內(nèi)存的丟失積累到一定的程度,怪事就該出現(xiàn)了。
這個(gè)問題實(shí)際是人腦和電腦復(fù)雜度的比較問題。不幸的是,人腦注定要輸給電腦(在某些方面)。這就要求系統(tǒng)提供一種機(jī)制來統(tǒng)一管理和回收垃圾。
不同語(yǔ)言和系統(tǒng)的垃圾回收機(jī)制是不同的。
C語(yǔ)言實(shí)際沒有垃圾回收機(jī)制,一切依賴程序員和操作系統(tǒng)。如果編寫的程序忘記釋放內(nèi)存而又長(zhǎng)時(shí)間的運(yùn)行,麻煩就來了。而如果編譯器本身的庫(kù)函數(shù)有問題,那就更可怕了。Borland的C/C++編譯器經(jīng)常有這個(gè)問題,業(yè)界很多人都知道的,因此很少有人敢用它來做大的軟件。
C++語(yǔ)言在類的析構(gòu)函數(shù)中提供垃圾回收,由程序員決定釋放那些資源,當(dāng)程序調(diào)用某個(gè)類的析構(gòu)函數(shù)時(shí),垃圾回收工作執(zhí)行并完成。這實(shí)際上任然是程序員控制的方式。
Java則提供了獨(dú)立的垃圾回收機(jī)制,它無需程序員的介入,由Java虛擬機(jī)來決定何時(shí)進(jìn)行垃圾回收。當(dāng)然程序員在一定情況下可以強(qiáng)制垃圾回收機(jī)制立即工作,方法是調(diào)用system.gc下面的幾個(gè)方法(具體查書)。
具體的實(shí)現(xiàn)分為兩大部分,一部分是如何確定哪些是垃圾,另一部分是如何回收。
在第一部分中有兩大類方法,第一種是所謂的引用計(jì)數(shù)法,引用計(jì)數(shù)為零的自然是垃圾了,這種方法很簡(jiǎn)單,但是無法處理相互引用的問題;第二種是所謂的順藤摸瓜法,因?yàn)镴ava所有的東西無非兩大類,目標(biāo)和非目標(biāo),目標(biāo)存在堆中,非目標(biāo)存在棧中,棧的先進(jìn)后出方式?jīng)Q定了不會(huì)有垃圾問題,而所有的目標(biāo)都是Object的某代后代。從頭摸起,就可以確定誰(shuí)是好人(有人要的,有領(lǐng)導(dǎo)的),誰(shuí)是壞蛋(沒有人要的,沒有領(lǐng)導(dǎo)的),將壞蛋處理就是了。
第二部分又分成兩大類,同步和異步。
所謂同步就是在某一時(shí)刻所有的處理暫停,作垃圾回收,然后再繼續(xù)暫停的處理。這種方法很簡(jiǎn)單,但是會(huì)造成系統(tǒng)性能的顛簸。
所謂異步就是分成兩步走,先暫停處理,進(jìn)行標(biāo)記;然后將系統(tǒng)分區(qū),按分區(qū)分別處理壞蛋,這種方法的好處是系統(tǒng)性能的顛簸會(huì)減少,缺點(diǎn)是由于同步的問題,可能放過壞人。
PC上一般使用同步的方法,因?yàn)镻C上的應(yīng)用一般不太大,系統(tǒng)顛簸的影響不大。AS/400上一般使用異步的方法,和AS/400的系統(tǒng)特點(diǎn)(多個(gè)子系統(tǒng))相結(jié)合,可以將不足降到最小,當(dāng)然AS/400也可以使用同步的方法,這可以在WebSphere for AS/400中進(jìn)行設(shè)置。
.Net的垃圾回收機(jī)制和Java的非常相似,這里就不贅述了。
software_young 編輯于 2002-02-01 13:55 ----------------------轉(zhuǎn)載結(jié)束--------------
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!