免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
java垃圾收集
垃圾收集器是 Java 語(yǔ)言區(qū)別于其他程序設(shè)計(jì)語(yǔ)言的一大特色。它把程序員從手工回收內(nèi)存空間的繁重工作中解脫了出來(lái)。在 SUN 公司的 Java 程序員( Java Programmer )認(rèn)證考試中,垃圾收集器是必考的內(nèi)容,一般最多可以占總分值的 6% 左右。但是由于 SUN 公司的 Java Programming Language SL-275 課程的標(biāo)準(zhǔn)教材中,對(duì)有關(guān)垃圾收集器的內(nèi)容只做了非常簡(jiǎn)單的介紹,而另外的一些關(guān)于 Java 技術(shù)的書籍,比如《 Java 2 核心技術(shù)》( Core Java 2 )、《 Java 編程思想》( Thinking in Java )、《精通 Java 2 》等等,里面關(guān)于垃圾收集器的內(nèi)容也幾乎沒(méi)有,或者只是簡(jiǎn)單地提兩句,所以很多參加 Java Programmer 認(rèn)證考試的中國(guó)考生,在垃圾收集器這一部分的得分都為 0 分(筆者曾認(rèn)識(shí)一位 SUN 公司授權(quán)的中國(guó) Java 培訓(xùn)班的老師,其考試總分為 89% ,但垃圾收集器的部分竟然也為 0 分)。

鑒于此,筆者總結(jié)了這個(gè)垃圾收集器的專題,希望對(duì)廣大 Java 技術(shù)的愛(ài)好者和準(zhǔn)備認(rèn)證考試的考生們有所幫助。



我們知道,許多程序設(shè)計(jì)語(yǔ)言都允許在程序運(yùn)行期動(dòng)態(tài)地分配內(nèi)存空間。分配內(nèi)存的方式多種多樣,取決于該種語(yǔ)言的語(yǔ)法結(jié)構(gòu)。但不論是哪一種語(yǔ)言的內(nèi)存分配方式,最后都要返回所分配的內(nèi)存塊的起始地址,即返回一個(gè)指針到內(nèi)存塊的首地址。


當(dāng)已經(jīng)分配的內(nèi)存空間不再需要時(shí),換句話說(shuō)當(dāng)指向該內(nèi)存塊的句柄超出了使用范圍的時(shí)候,該程序或其運(yùn)行環(huán)境就應(yīng)該回收該內(nèi)存空間,以節(jié)省寶貴的內(nèi)存資源。


在 C , C++ 或其他程序設(shè)計(jì)語(yǔ)言中,無(wú)論是對(duì)象還是動(dòng)態(tài)配置的資源或內(nèi)存,都必須由程序員自行聲明產(chǎn)生和回收,否則其中的資源將消耗,造成資源的浪費(fèi)甚至死機(jī)。但手工回收內(nèi)存往往是一項(xiàng)復(fù)雜而艱巨的工作。因?yàn)橐A(yù)先確定占用的內(nèi)存空間是否應(yīng)該被回收是非常困難的!如果一段程序不能回收內(nèi)存空間,而且在程序運(yùn)行時(shí)系統(tǒng)中又沒(méi)有了可以分配的內(nèi)存空間時(shí),這段程序就只能崩潰。通常,我們把分配出去后,卻無(wú)法回收的內(nèi)存空間稱為 " 內(nèi)存滲漏體( Memory Leaks ) " 。


以上這種程序設(shè)計(jì)的潛在危險(xiǎn)性在 Java 這樣以嚴(yán)謹(jǐn)、安全著稱的語(yǔ)言中是不允許的。但是 Java 語(yǔ)言既不能限制程序員編寫程序的自由性,又不能把聲明對(duì)象的部分去除(否則就不是面向?qū)ο蟮某绦蛘Z(yǔ)言了),那么最好的解決辦法就是從 Java 程序語(yǔ)言本身的特性入手。于是, Java 技術(shù)提供了一個(gè)系統(tǒng)級(jí)的線程( Thread ),即垃圾收集器線程( Garbage Collection Thread ),來(lái)跟蹤每一塊分配出去的內(nèi)存空間,當(dāng) Java 虛擬機(jī)( Java Virtual Machine )處于空閑循環(huán)時(shí),垃圾收集器線程會(huì)自動(dòng)檢查每一快分配出去的內(nèi)存空間,然后自動(dòng)回收每一快可以回收的無(wú)用的內(nèi)存塊。


垃圾收集器線程是一種低優(yōu)先級(jí)的線程,在一個(gè) Java 程序的生命周期中,它只有在內(nèi)存空閑的時(shí)候才有機(jī)會(huì)運(yùn)行。它有效地防止了內(nèi)存滲漏體的出現(xiàn),并極大可能地節(jié)省了寶貴的內(nèi)存資源。但是,通過(guò) Java 虛擬機(jī)來(lái)執(zhí)行垃圾收集器的方案可以是多種多樣的。


下面介紹垃圾收集器的特點(diǎn)和它的執(zhí)行機(jī)制:
垃圾收集器系統(tǒng)有自己的一套方案來(lái)判斷哪個(gè)內(nèi)存塊是應(yīng)該被回收的,哪個(gè)是不符合要求暫不回收的。垃圾收集器在一個(gè) Java 程序中的執(zhí)行是自動(dòng)的,不能強(qiáng)制執(zhí)行,即使程序員能明確地判斷出有一塊內(nèi)存已經(jīng)無(wú)用了,是應(yīng)該回收的,程序員也不能強(qiáng)制垃圾收集器回收該內(nèi)存塊。程序員唯一能做的就是通過(guò)調(diào)用 System. gc 方法來(lái) " 建議 " 執(zhí)行垃圾收集器,但其是否可以執(zhí)行,什么時(shí)候執(zhí)行卻都是不可知的。這也是垃圾收集器的最主要的缺點(diǎn)。當(dāng)然相對(duì)于它給程序員帶來(lái)的巨大方便性而言,這個(gè)缺點(diǎn)是瑕不掩瑜的。 垃圾收集器的主要特點(diǎn)有:
1 .垃圾收集器的工作目標(biāo)是回收已經(jīng)無(wú)用的對(duì)象的內(nèi)存空間,從而避免內(nèi)存滲漏體的產(chǎn)生,節(jié)省內(nèi)存資源,避免程序代碼的崩潰。


2 .垃圾收集器判斷一個(gè)對(duì)象的內(nèi)存空間是否無(wú)用的標(biāo)準(zhǔn)是:如果該對(duì)象不能再被程序中任何一個(gè) " 活動(dòng)的部分 " 所引用,此時(shí)我們就說(shuō),該對(duì)象的內(nèi)存空間已經(jīng)無(wú)用。所謂 " 活動(dòng)的部分 " ,是指程序中某部分參與程序的調(diào)用,正在執(zhí)行過(guò)程中,尚未執(zhí)行完畢。


3 .垃圾收集器線程雖然是作為低優(yōu)先級(jí)的線程運(yùn)行,但在系統(tǒng)可用內(nèi)存量過(guò)低的時(shí)候,它可能會(huì)突發(fā)地執(zhí)行來(lái)挽救內(nèi)存資源。當(dāng)然其執(zhí)行與否也是不可預(yù)知的。


4 .垃圾收集器不可以被強(qiáng)制執(zhí)行,但程序員可以通過(guò)調(diào)用 System. gc 方法來(lái)建議執(zhí)行垃圾收集器。


5 .不能保證一個(gè)無(wú)用的對(duì)象一定會(huì)被垃圾收集器收集,也不能保證垃圾收集器在一段 Java 語(yǔ)言代碼中一定會(huì)執(zhí)行。因此在程序執(zhí)行過(guò)程中被分配出去的內(nèi)存空間可能會(huì)一直保留到該程序執(zhí)行完畢,除非該空間被重新分配或被其他方法回收。由此可見(jiàn),完全徹底地根絕內(nèi)存滲漏體的產(chǎn)生也是不可能的。但是請(qǐng)不要忘記, Java 的垃圾收集器畢竟使程序員從手工回收內(nèi)存空間的繁重工作中解脫了出來(lái)。設(shè)想一個(gè)程序員要用 C 或 C++ 來(lái)編寫一段 10 萬(wàn)行語(yǔ)句的代碼,那么他一定會(huì)充分體會(huì)到 Java 的垃圾收集器的優(yōu)點(diǎn)!


6 .同樣沒(méi)有辦法預(yù)知在一組均符合垃圾收集器收集標(biāo)準(zhǔn)的對(duì)象中,哪一個(gè)會(huì)被首先收集。


7 .循環(huán)引用對(duì)象不會(huì)影響其被垃圾收集器收集。


8 .可以通過(guò)將對(duì)象的引用變量( reference variables ,即句柄 handles )初始化為 null 值,來(lái)暗示垃圾收集器來(lái)收集該對(duì)象。但此時(shí),如果該對(duì)象連接有事件監(jiān)聽器(典型的 AWT 組件),那它還是不可以被收集。所以在設(shè)一個(gè)引用變量為 null 值之前,應(yīng)注意該引用變量指向的對(duì)象是否被監(jiān)聽,若有,要首先除去監(jiān)聽器,然后才可以賦空值。


9 .每一個(gè)對(duì)象都有一個(gè) finalize( ) 方法,這個(gè)方法是從 Object 類繼承來(lái)的。


10 . finalize( ) 方法用來(lái)回收內(nèi)存以外的系統(tǒng)資源,就像是文件處理器和網(wǎng)絡(luò)連接器。該方法的調(diào)用順序和用來(lái)調(diào)用該方法的對(duì)象的創(chuàng)建順序是無(wú)關(guān)的。換句話說(shuō),書寫程序時(shí)該方法的順序和方法的實(shí)際調(diào)用順序是不相干的。請(qǐng)注意這只是 finalize( ) 方法的特點(diǎn)。


11 .每個(gè)對(duì)象只能調(diào)用 finalize( ) 方法一次。如果在 finalize( ) 方法執(zhí)行時(shí)產(chǎn)生異常( exception ),則該對(duì)象仍可以被垃圾收集器收集。


12 .垃圾收集器跟蹤每一個(gè)對(duì)象,收集那些不可到達(dá)的對(duì)象(即該對(duì)象沒(méi)有被程序的任何 " 活的部分 " 所調(diào)用),回收其占有的內(nèi)存空間。但在進(jìn)行垃圾收集的時(shí)候,垃圾收集器會(huì)調(diào)用 finalize( ) 方法,通過(guò)讓其他對(duì)象知道它的存在,而使不可到達(dá)的對(duì)象再次 " 復(fù)蘇 " 為可到達(dá)的對(duì)象。既然每個(gè)對(duì)象只能調(diào)用一次 finalize( ) 方法,所以每個(gè)對(duì)象也只可能 " 復(fù)蘇 " 一次。


13 . finalize( ) 方法可以明確地被調(diào)用,但它卻不能進(jìn)行垃圾收集。


14 . finalize( ) 方法可以被重載( overload ),但只有具備初始的 finalize( ) 方法特點(diǎn)的方法才可以被垃圾收集器調(diào)用。


15 .子類的 finalize( ) 方法可以明確地調(diào)用父類的 finalize( ) 方法,作為該子類對(duì)象的最后一次適當(dāng)?shù)牟僮鳌5?Java 編譯器卻不認(rèn)為這是一次覆蓋操作( overriding ),所以也不會(huì)對(duì)其調(diào)用進(jìn)行檢查。


16 .當(dāng) finalize( ) 方法尚未被調(diào)用時(shí), System. runFinalization( ) 方法可以用來(lái)調(diào)用 finalize( ) 方法,并實(shí)現(xiàn)相同的效果,對(duì)無(wú)用對(duì)象進(jìn)行垃圾收集。


17 .當(dāng)一個(gè)方法執(zhí)行完畢,其中的局部變量就會(huì)超出使用范圍,此時(shí)可以被當(dāng)作垃圾收集,但以后每當(dāng)該方法再次被調(diào)用時(shí),其中的局部變量便會(huì)被重新創(chuàng)建。


18 . Java 語(yǔ)言使用了一種 " 標(biāo)記交換區(qū)的垃圾收集算法 " 。該算法會(huì)遍歷程序中每一個(gè)對(duì)象的句柄,為被引用的對(duì)象做標(biāo)記,然后回收尚未做標(biāo)記的對(duì)象。所謂遍歷可以簡(jiǎn)單地理解為 " 檢查每一個(gè) " 。


19 . Java 語(yǔ)言允許程序員為任何方法添加 finalize( ) 方法,該方法會(huì)在垃圾收集器交換回收對(duì)象之前被調(diào)用。但不要過(guò)分依賴該方法對(duì)系統(tǒng)資源進(jìn)行回收和再利用,因?yàn)樵摲椒ㄕ{(diào)用后的執(zhí)行結(jié)果是不可預(yù)知的。


通過(guò)以上對(duì)垃圾收集器特點(diǎn)的了解,你應(yīng)該可以明確垃圾收集器的作用,和垃圾收集器判斷一塊內(nèi)存空間是否無(wú)用的標(biāo)準(zhǔn)。簡(jiǎn)單地說(shuō),當(dāng)你為一個(gè)對(duì)象賦值為 null 并且重新定向了該對(duì)象的引用,此時(shí)該對(duì)象就符合垃圾收集器的收集標(biāo)準(zhǔn)。


判斷一個(gè)對(duì)象是否符合垃圾收集器的收集標(biāo)準(zhǔn),這是 SUN 公司程序員認(rèn)證考試中垃圾收集器部分的重要考點(diǎn)(可以說(shuō),這是唯一的考點(diǎn))。所以,考生在一段給定的代碼中,應(yīng)該能夠判斷出哪個(gè)對(duì)象符合垃圾收集器收集的標(biāo)準(zhǔn),哪個(gè)不符合。下面結(jié)合幾種認(rèn)證考試中可能出現(xiàn)的題型來(lái)具體講解:


Object obj = new Object ( ) ;
我們知道, obj 為 Object 的一個(gè)句柄。當(dāng)出現(xiàn) new 關(guān)鍵字時(shí),就給新建的對(duì)象分配內(nèi)存空間,而 obj 的值就是新分配的內(nèi)存空間的首地址,即該對(duì)象的值 ( 請(qǐng)?zhí)貏e注意,對(duì)象的值和對(duì)象的內(nèi)容是不同含義的兩個(gè)概念:對(duì)象的值就是指其內(nèi)存塊的首地址,即對(duì)象的句柄;而對(duì)象的內(nèi)容則是其具體的內(nèi)存塊 ) 。此時(shí)如果有 obj = null ; 則 obj 指向的內(nèi)存塊此時(shí)就無(wú)用了,因?yàn)橄旅嬖贈(zèng)]有調(diào)用該變量了。
請(qǐng)?jiān)倏匆韵氯N認(rèn)證考試時(shí)可能出現(xiàn)的題型:

程序段 1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
問(wèn):這段代碼中,第幾行的fobj 符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第1行。因?yàn)榈?行的fobj被賦了新值,產(chǎn)生了一個(gè)新的對(duì)象,即換了一塊新的內(nèi)存空間,也相當(dāng)于為第1行中的fobj賦了null值。這種類型的題在認(rèn)證0考試中是最簡(jiǎn)單的。


程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.Object sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第1行和第3行。因?yàn)榈?行為sobj賦值為null,所以在此第1行的sobj符合垃圾收集器的收集標(biāo)準(zhǔn)。而第4行相當(dāng)于為sobj賦值為null,所以在此第3行的sobj也符合垃圾收集器的收集標(biāo)準(zhǔn)。
如果有一個(gè)對(duì)象的句柄a,且你把a(bǔ)作為某個(gè)構(gòu)造器的參數(shù),即 new Constructor ( a )的時(shí)候,即使你給a賦值為null,a也不符合垃圾收集器的收集標(biāo)準(zhǔn)。直到由上面構(gòu)造器構(gòu)造的新對(duì)象被賦空值時(shí),a才可以被垃圾收集器收集。

程序段3:
1.Object aobj = new Object ( ) ;
2.Object bobj = new Object ( ) ;
3.Object cobj = new Object ( ) ;
4.a(chǎn)obj = bobj;
5.a(chǎn)obj = cobj;
6.cobj = null;
7.a(chǎn)obj = null;
問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第7行。注意這類題型是認(rèn)證考試中可能遇到的最難題型了。
行1-3分別創(chuàng)建了Object類的三個(gè)對(duì)象:aobj,bobj,cobj
行4:此時(shí)對(duì)象aobj的句柄指向bobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。
行5:此時(shí)對(duì)象aobj的句柄指向cobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。
行6:此時(shí)仍沒(méi)有任何一個(gè)對(duì)象符合垃圾收集器的收集標(biāo)準(zhǔn)。
行7:對(duì)象cobj符合了垃圾收集器的收集標(biāo)準(zhǔn),因?yàn)閏obj的句柄指向單一的地址空間。在第6行的時(shí)候,cobj已經(jīng)被賦值為null,但由cobj同時(shí)還指向了aobj(第5行),所以此時(shí)cobj并不符合垃圾收集器的收集標(biāo)準(zhǔn)。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說(shuō)明了,由cobj所指向的地址空間已經(jīng)被完全地賦予了空值。所以此時(shí)cobj最終符合了垃圾收集器的收集標(biāo)準(zhǔn)。 但對(duì)于aobj和bobj,仍然無(wú)法判斷其是否符合收集標(biāo)準(zhǔn)。
總之,在Java語(yǔ)言中,判斷一塊內(nèi)存空間是否符合垃圾收集器收集標(biāo)準(zhǔn)的標(biāo)準(zhǔn)只有兩個(gè):
1.給對(duì)象賦予了空值null,以下再?zèng)]有調(diào)用過(guò)。
2.給對(duì)象賦予了新值,既重新分配了內(nèi)存空間。
最后再次提醒一下,一塊內(nèi)存空間符合了垃圾收集器的收集標(biāo)準(zhǔn),并不意味著這塊內(nèi)存空間就一定會(huì)被垃圾收集器收集

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java內(nèi)存管理
Java垃圾收集算法與內(nèi)存泄露
說(shuō)說(shuō)Java的四大引用
高性能JAVA代碼之_內(nèi)存管理
Java中的Reference對(duì)象[譯]
Java常見(jiàn)的四種引用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服