資源描述:
《深入java50的垃圾收集機(jī)制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、J2SE綜合:深入了解Java5.0的垃圾收集內(nèi)存管理是影響軟件應(yīng)用程序性能的一個(gè)重耍因索。與實(shí)際的數(shù)據(jù)計(jì)算時(shí)間相比,分配和卸載內(nèi)存所用的時(shí)間更長(zhǎng)。址然C++可對(duì)內(nèi)存分配與鄴放進(jìn)行直接控制,Java利用垃圾收集來回收程序不再需要的內(nèi)存,試圖掌握內(nèi)存管理。但是,在需要實(shí)時(shí)性能時(shí),與垃圾收集冇關(guān)的“暫?!币恢笔侨藗兎磳?duì)應(yīng)對(duì)Java的中心論點(diǎn)。垃圾收集是一個(gè)周期性的過程,它中斷程序的正常執(zhí)行,分析對(duì)象引川,并回收被分配但不再被引川訪問的內(nèi)存。在大51Java應(yīng)川程序中,垃圾收集暫停可能持續(xù)兒秒鐘,這段時(shí)間足以中斷任何類型的實(shí)時(shí)通信或控制系統(tǒng)。因此,垃圾收集提
2、供的內(nèi)存提取要求一些開發(fā)者更仔細(xì)地考慮內(nèi)存管理問題。即使Java并沒冇提供和C++同等級(jí)別的內(nèi)存分配控制,編程模式仍然會(huì)對(duì)Java應(yīng)用程序的內(nèi)存性能產(chǎn)生重大影響。在木文中,我將簡(jiǎn)單冋顧一下J。陽(yáng)5.0的垃圾收集調(diào)整功能。Java5.0垃圾收集原理Java1.5新特性??工效學(xué)??的目標(biāo)是通過最少的命令行調(diào)整,為JVM提供優(yōu)良的性能。工效學(xué)試圖為一個(gè)應(yīng)用程序選擇最佳的垃圾收集器、堆大小與運(yùn)行時(shí)間編譯器。垃圾收集器的選擇何時(shí)會(huì)對(duì)用戶產(chǎn)生影響呢?對(duì)許多應(yīng)用程序來說,它根本沒冇影響。也就是說,在垃圾收集產(chǎn)生的暫停的頻率與持續(xù)時(shí)間適度的情況下,應(yīng)川程序可在其規(guī)范
3、內(nèi)執(zhí)行。如果一個(gè)大型應(yīng)川程序出現(xiàn)擴(kuò)充,產(chǎn)生大量線程、處理器、套接字和許多內(nèi)存,就會(huì)出現(xiàn)例外。如果一個(gè)對(duì)彖再也不能通過運(yùn)行程序中的任何指針到達(dá),則視其為垃圾。最吉接的垃圾收集運(yùn)算法則簡(jiǎn)單地在每個(gè)可到達(dá)的對(duì)彖間迭代。那么,剩下的對(duì)彖即為垃圾。這一方法所用的時(shí)間與活動(dòng)對(duì)彖的數(shù)目成比例關(guān)系,且禁止用于維護(hù)許多活動(dòng)數(shù)據(jù)的人型應(yīng)用程序。從Java2開始,虛擬機(jī)合并了許多應(yīng)用分代收集組合的各種收集運(yùn)算法則。盡管簡(jiǎn)單的垃圾收集檢查堆中的每一個(gè)活動(dòng)對(duì)彖,但分代收集利用多數(shù)應(yīng)用程序的幾個(gè)憑經(jīng)驗(yàn)觀察得到的特性來避免額外工作。這些觀察得到的特性中最為巫耍的一個(gè)就是所謂的早期失
4、效率。許多對(duì)彖分配以厲很快“已經(jīng)死亡”。例如,迭代器對(duì)彖僅在單獨(dú)循環(huán)中存活。為優(yōu)化這種情況,我們對(duì)內(nèi)存進(jìn)行分代管理,或在內(nèi)存池中保留不同年齡的對(duì)象。當(dāng)-?代裝滿時(shí),就對(duì)這個(gè)代進(jìn)行垃圾收集。對(duì)象被分配到更年齡對(duì)象代,或新生代中。由于早期失效率,多數(shù)對(duì)象在那里死亡。如果垃圾收集器成為瓶頸,你可能希望H定義代的大小。詳細(xì)檢查垃圾收集器的輸出,然后探究單個(gè)性能計(jì)量單位對(duì)垃圾收集器參數(shù)的靈斂度。初始化時(shí),保留一個(gè)垠大的地址空間,在必要時(shí)才分配給物理內(nèi)存。為對(duì)彖內(nèi)存保留的全部地址空間可分為新生代和IH生代。新生代由eden和兩個(gè)生存空間組成。對(duì)彖最初分配到eden
5、屮。任何時(shí)候,一個(gè)生存空間為空,并作為下一個(gè)空間的目的地,在edcn與另一個(gè)生存空間中復(fù)制活動(dòng)對(duì)彖的集合。對(duì)彖以這種方式在生存空間屮復(fù)制,直到它們老化,或復(fù)制到111生代屮。與III生代關(guān)系密切的第三個(gè)代稱為永生代。這是一個(gè)特別的代,因?yàn)樗A籼摂M機(jī)所需要的數(shù)據(jù),來描述在Java語(yǔ)言中沒有等同物的對(duì)彖。例如,描述類與方法的對(duì)彖存儲(chǔ)在永生代中。性能因索Java應(yīng)用程序(特別是垃圾收集)有兩個(gè)性能計(jì)量單位:吞吐量與暫停。吞吐量是指在一段較長(zhǎng)時(shí)間內(nèi),沒有用于垃圾收集的時(shí)間百分比。吞吐量包括用于分配的時(shí)間(但用于調(diào)整分配速度的時(shí)間一般不包括在內(nèi))。暫停是應(yīng)用程
6、序因?yàn)槔占霈F(xiàn)的停頓時(shí)間。一些用戶還對(duì)其他因索較為敏感。例如,占川率(footprint)是-批工作進(jìn)程的集合,以頁(yè)和緩沖行數(shù)計(jì)最,在物理內(nèi)存冇限或者冇很多進(jìn)程的系統(tǒng)屮,占用率可表示擴(kuò)展性。反應(yīng)性(Promptness)是對(duì)彖死去的時(shí)間和內(nèi)存變?yōu)榭捎脮r(shí)的時(shí)間差,是分布系統(tǒng),包括遠(yuǎn)程方法調(diào)用(RMT)中的重要因素。通常來說,特定的代大小選擇這些因索之間的平衡作用。例如,一個(gè)非常大的新生代的吞吐量可以最大,但這要以曬牲占用率、反應(yīng)性和暫停時(shí)間為代價(jià)。你也可以曬牲吞吐量,應(yīng)用一個(gè)小型的新生代來使新生代暫停時(shí)間最短。如果你希望提高有大量處理器的應(yīng)川程序的
7、性能,你應(yīng)該使川吞吐量收集器。你可以川命令行標(biāo)記-XX:+UseParallelGC來激活吞吐量收集器。你可以用ParalielGCThreads選項(xiàng)-XX:ParallelGCThreads=來控制垃圾收集器線程的數(shù)量。最大暫停時(shí)間目標(biāo)川命令行標(biāo)記-XX:MaxGCPauscMillis-來指定,這是對(duì)吞吐量收集器的一個(gè)暗示,即它需要毫秒或更短的暫停時(shí)間。存在有許多調(diào)整代大小的選項(xiàng),$ll-XX:YoungGenerationSizeIncrcmcnt-用于新生代;而-XX:TenuredGenerationSizelncrement二用于I日生代。
8、如果應(yīng)用程序受益于較短的垃圾收集器暫停,且能夠在應(yīng)用程序運(yùn)行時(shí)與垃圾收集器共享處理器資源,我建