国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java的垃圾回收機制研究

瀏覽:97日期:2024-06-09 08:43:16

一、誰在做Garbage Collection?

一種流行的說法:在C++里,是系統(tǒng)在做垃圾回收;而在Java里,是Java自身在做。

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

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

二、對象在啥時被丟棄?

在C++里,當(dāng)對象離開其作用域時,該對象即被應(yīng)用拋棄。

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

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

一個對象,可以有一個或多個引用變量指向它。當(dāng)一個對象不再有任何一個引用變量指向它時,這個對象就被應(yīng)用拋棄了。或者說,這個對象可以被垃圾回收機制回收了。

這就是說,當(dāng)不存在對某對象的任何引用時,就意味著,應(yīng)用告訴JVM:我不要這個對象,你可以回收了。

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

三、丟棄就被回收?

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

但是,并不是對象被拋棄后當(dāng)即被回收的。JVM進程做空間回收有較大的系統(tǒng)開銷。如果每當(dāng)某應(yīng)用進程丟棄一個對象,就立即回收它的空間,勢必會使整個系統(tǒng)的運轉(zhuǎn)效率非常低下。

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

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

四、沒有引用變量指向的對象有用嗎?

前面說了,沒掛上引用變量的對象是被應(yīng)用丟棄的,這意味著,它在堆空間里是個垃圾,隨時可能被JVM回收。

不過,這里有個不是例外的例外。對于一次性使用的對象(有些書稱之為臨時對象),可以不用引用變量指向它。舉個最簡單也最常見的例子:

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

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

五、應(yīng)用能干預(yù)垃圾回收嗎?

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

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

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

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

六、對象被回收時要做的事

一個對象在運行時,可能會有一些東西與其關(guān)連。因此,當(dāng)對象即將被銷毀時,有時需要做一些善后工作。可以把這些操作寫在finalize()方法(常稱之為終止器)里。

protected void finalize()

{

// finalization code here

}

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

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

至少對于文件操作,編碼者應(yīng)認清Java終止器與C++析構(gòu)函數(shù)之間的差異。

那么,當(dāng)應(yīng)用終止,會不會執(zhí)行應(yīng)用中的所有finalize()呢?據(jù)Bruce Eckel在Thinking in Java里的觀點:“到程序結(jié)束的時候,并非所有收尾模塊都會得到調(diào)用”。這還僅僅是指應(yīng)用正常終止的場合,非正常終止呢?

因此,哪些收尾操作可以放在finalize()里,是需要酌酎的。

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本免费一区视频 | 欧美与黑人午夜性猛交久久久 | 国产欧美网站 | 亚洲欧洲久久久精品 | 99国产精品免费观看视频 | 久久国产夜色精品噜噜亚洲a | 久久精品国产只有精品6 | 亚洲欧美精品中字久久99 | 91香蕉成人 | 亚洲成人综合网站 | 欧美日韩色黄大片在线视频 | 国产欧美一区二区三区精品 | 成人a级高清视频在线观看 成人a毛片 | 成人合成mv福利视频网站 | 在线观看免费视频网站色 | 亚洲国产成人久久精品图片 | 国产美女野外做爰 | a级特黄毛片免费观看 | 亚洲社区在线 | 久久久久国产成人精品亚洲午夜 | 日本三级香港三级乳网址 | 99在线在线视频免费视频观看 | 国产成人精品午夜免费 | 玖草| 91精品国产手机 | 亚洲美色综合天天久久综合精品 | 91精品专区| 免费观看欧美精品成人毛片能看的 | a黄视频 | 国产丶欧美丶日韩丶不卡影视 | 国产欧美日韩亚洲 | 久久久久久国产精品视频 | 2022国产精品手机在线观看 | 最新国产三级久久 | 亚洲品质自拍视频网站 | 三级黄色在线播放 | 亚洲欧美日韩精品高清 | 在线精品亚洲欧洲第一页 | 欧美一区二区三区国产精品 | 久久免费影院 | 99视频在线精品免费 |