国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

【轉(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é)束------------------------
    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 九龙坡区| 阿勒泰市| 长沙市| 广宁县| 凌源市| 宁海县| 明星| 祁东县| 长子县| 沙坪坝区| 武定县| 时尚| 崇文区| 青海省| 通化市| 定襄县| 鄂伦春自治旗| 桦甸市| 徐州市| 洛隆县| 南城县| 舒兰市| 金门县| 岑巩县| 卢龙县| 葵青区| 通河县| 建宁县| 荔波县| 上蔡县| 和平县| 嘉禾县| 华蓥市| 清新县| 山阴县| 泾川县| 临西县| 佛坪县| 鸡东县| 衡水市| 鸡东县|