欢迎来到天天文库
浏览记录
ID:13160988
大小:36.00 KB
页数:7页
时间:2018-07-21
《jvm 1.4.1 中的垃圾收集》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Java理論與實踐:JVM1.4.1中的垃圾收集內容:舊物件和新物件分代收集(GenerationalCollection)JDK1.4.1預設收集器微調垃圾收集器結語參考資料關於作者對本文的評價相關內容:Java理論與實踐系列Mashthattrash--IncrementalcompactionintheIBMJDKGarbageCollectorSensiblesanitation--UnderstandingtheIBMJavaGarbageCollector,Part1:ObjectallocationIBMDeveloperKitsfortheJavaplatfo
2、rm(downloads)訂閱:dW技術電子報分代及並行垃圾收集BrianGoetz首席顧問,QuiotixCorp2003年12月01日在上月的Java理論與實踐中,專欄作家BrianGoetz回顧了垃圾收集的基本演算法。本月,他進一步探討JVM1.4.1是如何實際處理GarbageCollection,包括一些新的針對多處理器系統的GarbageCollection。請在本文論壇上與作者及其它讀者分享您對本文的心得(您也可以按下文章頂部或底部的討論進入此論壇)。上個月,我們分析了參照計數(ReferenceCounting)、複製(Copying)、標籤-清除(mark-
3、sweep)和標籤-整理(mark-compact)這些經典的GarbageCollection技術。其中每一種方法在特定條件下都有其優點和缺點。例如,當有很多物件成為垃圾時,複製可以做得很好,但是有許多長久物件時它就變得很糟(要反覆複製它們)。相反,標籤-整理對於長久物件可以做得很好(只複製一次),但是當有許多短暫物件時就沒有那麼好了。JVM1.2及以後版本使用的技術稱為分代垃圾收集(generationalgarbagecollection),它結合這兩種技術的優點,讓物件指派的負擔變小。舊物件和新物件在任何一個應用程式Heap中,一些物件在建立後很快就成為垃圾,另一些則
4、在程式的整個執行期間一直保持生存。經驗分析表示,對於大多數物件導向語言,包括Java,絕大多數物件─可以多達98%(這取決於您對新物件的衡量標準)是在年輕的時候死亡的。可以用小時鐘秒數、物件指派以後記憶體管理子系統指派的總位元組或者物件指派後經歷的GarbageCollection次數來計算物件的壽命。但是不管您如何計算,分析顯示一件事─大多數物件是在年輕的時候死亡的。大多數物件在年輕時死亡這一事實對於收集器的選擇很有意義。特別是,當大多數物件在年輕時死亡時,複製收集器可以執行得相當好,因為複製收集器完全不存取死亡的物件,它們只是將活的物件複製到另一個Heap欄位中,然後一次
5、收回所有的剩餘空間。那些經歷過第一次GarbageCollection後仍能生存的物件,大部分會成為長久的或者永久的物件。根據短暫物件和長久物件的混合比例,不同GarbageCollection策略的效能會有非常大的差別。當大多數物件在年輕時死亡時,複製收集器可以執行得很好,因為年輕時死亡的物件永遠不需要複製。不過,複製收集器處理長久物件卻很糟糕,它要從一個半空間向另一個半空間反覆來回複製這些物件。相反,標籤-整理收集器對於長久物件可以工作得很好,因為長久物件趨向於沉在Heap的底部,因此不用再複製。不過,標籤-清除和標籤-理整收集器要做很多額外的分析死亡物件的工作,因為在清
6、除階段它們必須分析Heap中的每一個物件。分代收集(GenerationalCollection)分代收集器將Heap分為多個世代。在新世代中建立的物件,滿足某些提升標準的物件,如經歷了特定次數GarbageCollection的物件,將被提升到下一更舊的世代。分代收集器對不同的世代可以自由使用不同的收集策略,對各世代分別進行GarbageCollection。次要收集(MinorCollection)分代收集的一個優點是它不同時收集所有的世代,因此可以使GarbageCollection暫停更短。當指派器不能滿足指派請求時,它首先觸發一個要收集(minorcollectio
7、n),它只收集最新的世代。因為新世代中的許多物件已經死亡,複製收集器完全不用分析死亡的物件,所以次要收集的暫停可以相當短並通常可以回收大量的Heap空間。如果次要收集釋放了足夠的Heap空間,那麼使用者程式就可以立即恢復。如果它不能釋放足夠的Heap空間,那麼它就繼續收集上一世代,直到回收了足夠的記憶體。(在GarbageCollection進行了全部收集以後仍不能回收足夠的記憶體時,它將擴充Heap或者拋出OutOfMemoryError)。兩代之間的參照追蹤垃圾收集器(garbagecollecto
此文档下载收益归作者所有