<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 醫療電子 > 學(xué)習方法與實(shí)踐 > Java語(yǔ)言入門(mén)--簡(jiǎn)述Java語(yǔ)言回收機制

Java語(yǔ)言入門(mén)--簡(jiǎn)述Java語(yǔ)言回收機制

——
作者: 時(shí)間:2008-01-09 來(lái)源:賽迪網(wǎng) 收藏

 

       一.誰(shuí)在做Garbage Collection?

       一種流行的說(shuō)法:在C++里,是系統在做垃圾;而在里,是自身在做。

       在C++里,釋放內存是手動(dòng)處理的,要用delete運算符來(lái)釋放分配的內存。這是流行的說(shuō)法。確切地說(shuō),是應用認為不需要某實(shí)體時(shí),就需用delete告訴系統,可以這塊空間了。這個(gè)要求,對編碼者來(lái)說(shuō),是件很麻煩、很難做到的事。隨便上哪個(gè)BBS,在C/C++版塊里總是有一大堆關(guān)于內存泄漏的話(huà)題。

       采用一種不同的,很方便的方法:Garbage Collection。垃圾放在JVM里。JVM完全負責垃圾回收事宜,應用只在需要時(shí)申請空間,而在拋棄對象時(shí)不必關(guān)心空間回收問(wèn)題。

       二.對象在啥時(shí)被丟棄?

       在C++里,當對象離開(kāi)其作用域時(shí),該對象即被應用拋棄。

       是對象的生命期不再與其作用域有關(guān),而僅僅與引用有關(guān)。

       Java的垃圾回收一般包含近十種算法。對這些算法中的多數,我們不必予以關(guān)心。只有其中最簡(jiǎn)單的一個(gè):引用計數法,與編碼有關(guān)。

       一個(gè)對象,可以有一個(gè)或多個(gè)引用變量指向它。當一個(gè)對象不再有任何一個(gè)引用變量指向它時(shí),這個(gè)對象就被應用拋棄了?;蛘哒f(shuō),這個(gè)對象可以被垃圾回收回收了。

       這就是說(shuō),當不存在對某對象的任何引用時(shí),就意味著(zhù),應用告訴JVM:我不要這個(gè)對象,你可以回收了。

       JVM的垃圾回收機制對堆空間做實(shí)時(shí)檢測。當發(fā)現某對象的引用計數為0時(shí),就將該對象列入待回收列表中。但是,并不是馬上予以銷(xiāo)毀。

       三.丟棄就被回收?

       該對象被認定為沒(méi)有存在的必要了,那么它所占用的內存就可以被釋放。被回收的內存可以用于后續的再分配。

       但是,并不是對象被拋棄后當即被回收的。JVM進(jìn)程做空間回收有較大的系統開(kāi)銷(xiāo)。如果每當某應用進(jìn)程丟棄一個(gè)對象,就立即回收它的空間,勢必會(huì )使整個(gè)系統的運轉效率非常低下。

       前面說(shuō)過(guò),JVM的垃圾回收機制有多個(gè)算法。除了引用計數法是用來(lái)判斷對象是否已被拋棄外,其它算法是用來(lái)確定何時(shí)及如何做回收。JVM的垃圾回收機制要在時(shí)間和空間之間做個(gè)平衡。

       因此,為了提高系統效率,垃圾回收器通常只在滿(mǎn)足兩個(gè)條件時(shí)才運行:即有對象要回收且系統需要回收。切記垃圾回收要占用時(shí)間,因此,Java運行時(shí)系統只在需要的時(shí)候才使用它。因此你無(wú)法知道垃圾回收發(fā)生的精確時(shí)間。

       四.沒(méi)有引用變量指向的對象有用嗎?

       前面說(shuō)了,沒(méi)掛上引用變量的對象是被應用丟棄的,這意味著(zhù),它在堆空間里是個(gè)垃圾,隨時(shí)可能被JVM回收。

       不過(guò),這里有個(gè)不是例外的例外。對于一次性使用的對象(有些書(shū)稱(chēng)之為臨時(shí)對象),可以不用引用變量指向它。舉個(gè)最簡(jiǎn)單也最常見(jiàn)的例子:

       System.out.println(“I am Java!”);

       就是創(chuàng )建了一個(gè)字符串對象后,直接傳遞給println()方法。

       五.應用能干預垃圾回收嗎?

       許多人對Java的垃圾回收不放心,希望在應用代碼里控制JVM的垃圾回收運作。這是不可能的事。對垃圾回收機制來(lái)說(shuō),應用只有兩個(gè)途徑發(fā)消息給JVM。第一個(gè)前面已經(jīng)說(shuō)了,就是將指向某對象的所有引用變量全部移走。這就相當于向JVM發(fā)了一個(gè)消息:這個(gè)對象不要了。第二個(gè)是調用庫方法System.gc(),多數書(shū)里說(shuō)調用它讓Java做垃圾回收。

       第一個(gè)是一個(gè)告知,而調用System.gc()也僅僅是一個(gè)請求。JVM接受這個(gè)消息后,并不是立即做垃圾回收,而只是對幾個(gè)垃圾回收算法做了加權,使垃圾回收操作容易發(fā)生,或提早發(fā)生,或回收較多而已。

       希望JVM及時(shí)回收垃圾,是一種需求。其實(shí),還有相反的一種需要:在某段時(shí)間內最好不要回收垃圾。要求運行速度最快的實(shí)時(shí)系統,特別是系統,往往希望如此。

       Java的垃圾回收機制是為所有Java應用進(jìn)程服務(wù)的,而不是為某個(gè)特定的進(jìn)程服務(wù)的。因此,任何一個(gè)進(jìn)程都不能命令垃圾回收機制做什么、怎么做或做多少。

      六.對象被回收時(shí)要做的事

      一個(gè)對象在運行時(shí),可能會(huì )有一些東西與其關(guān)連。因此,當對象即將被銷(xiāo)毀時(shí),有時(shí)需要做一些善后工作??梢园堰@些操作寫(xiě)在finalize()方法(常稱(chēng)之為終止器)里。

protected void finalize()

{

  // finalization code here

}

      這個(gè)終止器的用途類(lèi)似于C++里的析構函數,而且都是自動(dòng)調用的。但是,兩者的調用時(shí)機不一樣,使兩者的表現行為有重大區別。C++的析構函數總是當對象離開(kāi)作用域時(shí)被調用。這就是說(shuō),C++析構函數的調用時(shí)機是確定的,且是可被應用判知的。但是,Java終止器卻是在對象被銷(xiāo)毀時(shí)。由上所知,被丟棄的對象何時(shí)被銷(xiāo)毀,應用是無(wú)法獲知的。而且,對于大多數場(chǎng)合,被丟棄對象在應用終止后仍未銷(xiāo)毀。

      在編碼時(shí),考慮到這一點(diǎn)。譬如,某對象在運作時(shí)打開(kāi)了某個(gè)文件,在對象被丟棄時(shí)不關(guān)閉它,而是把文件關(guān)閉語(yǔ)句寫(xiě)在終止器里。這樣做對文件操作會(huì )造成問(wèn)題。如果文件是獨占打開(kāi)的,則其它對象將無(wú)法訪(fǎng)問(wèn)這個(gè)文件。如果文件是共享打開(kāi)的,則另一訪(fǎng)問(wèn)該文件的對象直至應用終結仍不能讀到被丟棄對象寫(xiě)入該文件的新內容。

      至少對于文件操作,編碼者應認清Java終止器與C++析構函數之間的差異。

      那么,當應用終止,會(huì )不會(huì )執行應用中的所有finalize()呢?據Bruce Eckel在Thinking in Java里的觀(guān)點(diǎn):“到程序結束的時(shí)候,并非所有收尾模塊都會(huì )得到調用”。這還僅僅是指應用正常終止的場(chǎng)合,非正常終止呢?
因此,哪些收尾操作可以放在finalize()里,是需要酌酎的。 

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>