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