資源描述:
《java 垃圾收集機(jī)制研究》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、Java垃圾收集機(jī)制研究垃圾收集機(jī)制研究楊兆楠張樞摘要:Java語(yǔ)言使用最廣泛地依賴(lài)于垃圾收集的編程語(yǔ)言,垃圾收集的實(shí)現(xiàn)是保證Java虛擬機(jī)JVM卓越性能的關(guān)鍵。分析了JVM所使用的垃圾收集策略、不同垃圾收集策略對(duì)性能的影響,闡述如何才能幫助垃圾收集器取得更好的性能。關(guān)鍵詞:Java虛擬機(jī)垃圾收集器垃圾收集算法中圖分類(lèi)號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A0引言Java語(yǔ)言中一個(gè)顯著的特點(diǎn)就是引入了垃圾收集(GarbageCollection,簡(jiǎn)稱(chēng)GC)機(jī)制。垃圾收集是一種動(dòng)態(tài)存儲(chǔ)管理技術(shù),它自動(dòng)地釋放不再被程序引用的對(duì)象,按照特定的垃圾收集算法來(lái)實(shí)現(xiàn)資源自動(dòng)回收,在JVM中這一部分功能
2、和算法相應(yīng)地被稱(chēng)為垃圾收集器(Garbagecollector),垃圾收集的好處是無(wú)可爭(zhēng)辯的,可靠性提高、使內(nèi)存管理與類(lèi)接口設(shè)計(jì)分離,并使開(kāi)發(fā)者減少了跟蹤內(nèi)存管理錯(cuò)誤的時(shí)間。懸空指針和內(nèi)存泄漏問(wèn)題在Java程序中再也不會(huì)發(fā)生了Java程序可能會(huì)出現(xiàn)某種形式的內(nèi)存泄漏,更精確地說(shuō)是非故意的對(duì)象保留,但是這是一個(gè)不同的問(wèn)題。但是垃圾收集機(jī)制是有代價(jià)的,其中包括對(duì)性能的影響、暫停、配置復(fù)雜性和不確定的結(jié)束。同時(shí)不同類(lèi)型的應(yīng)用程序?qū)τ诶占胁煌囊?例如實(shí)時(shí)應(yīng)用程序會(huì)要求收集暫停的持續(xù)時(shí)間短并且有限制,而企業(yè)應(yīng)用程序可能允許更長(zhǎng)時(shí)間和可預(yù)測(cè)性更低的暫停以獲得更高的吞吐量。因此Ja
3、va開(kāi)發(fā)人員有必要充分了解Java的這一內(nèi)部機(jī)制,理解了JVM支持的垃圾收集算法和應(yīng)用程序?qū)π阅艿囊?便可以有效地對(duì)GC進(jìn)行優(yōu)化,提高整個(gè)應(yīng)用程序的性能。本文將分析JVM所使用的垃圾收集策略、不同垃圾收集策略對(duì)性能的影響和如何才能幫助垃圾收集器取得更好的性能。1GC算法分析任何一種垃圾收集算法所面臨的問(wèn)題是相同的——找出由分配器分配的但是用戶(hù)程序不可到達(dá)的內(nèi)存塊進(jìn)行回收。1.1基本算法1引用計(jì)數(shù)ReferenceCounting算法最直觀(guān)的垃圾收集策略是引用計(jì)數(shù)。每一個(gè)對(duì)象都有一個(gè)關(guān)聯(lián)的引用計(jì)數(shù),表示連接該對(duì)象的活躍引用的數(shù)量。當(dāng)有引用連接至對(duì)象時(shí),引用計(jì)數(shù)加1,當(dāng)引用離開(kāi)作
4、用域或置為null時(shí),引用計(jì)數(shù)減1。如果對(duì)象的引用計(jì)數(shù)是零,那么它就是垃圾,用戶(hù)程序不可到達(dá)它,并可以回收。這一算法在執(zhí)行垃圾收集任務(wù)時(shí)速度較快,但管理引用計(jì)數(shù)的開(kāi)銷(xiāo)在整個(gè)程序生命周期中將持續(xù)存在。更重要的是引用計(jì)數(shù)算法無(wú)法正確釋放循環(huán)引用的內(nèi)存塊。引用計(jì)數(shù)常用來(lái)說(shuō)明垃圾收集的工作方式,它從未被應(yīng)用于任何一種JVM實(shí)現(xiàn)中。2標(biāo)記——清除Mark-Salstyle="MARGIN:0cm0cm0pt;TEXT-INDENT:24pt;mso-char-indent-count:2.0">標(biāo)記——清除Mark-Salstyle="MARGIN:0cm0cm0pt;TEXT-INDE
5、NT:24pt;mso-char-indent-count:2.0">3復(fù)制Copying算法復(fù)制算法把整個(gè)堆分成相等的兩塊。在任意時(shí)刻,只有其中的一塊用于分配對(duì)象,另一塊是空的。在垃圾收集時(shí),用于分配對(duì)象的一塊稱(chēng)為源塊,空的一塊稱(chēng)為目的塊,所有從根對(duì)象出發(fā)可及的對(duì)象都從源塊拷貝到目的塊,在下一次垃圾收集時(shí),源塊和目的塊互換。這種方法效率很高,而且不存在內(nèi)存碎片,缺點(diǎn)是被分配的內(nèi)存只有一半是可用的,一半是空閑的,長(zhǎng)壽的對(duì)象在每次收集時(shí)都要來(lái)回復(fù)制。4標(biāo)記整理Markpact算法標(biāo)記整理算法是標(biāo)記清除算法和復(fù)制算法的有機(jī)結(jié)合。標(biāo)記整理是兩階段過(guò)程,在標(biāo)記階段訪(fǎng)問(wèn)并標(biāo)記每個(gè)活躍對(duì)象
6、。然后,復(fù)制標(biāo)記的對(duì)象,使所有活躍對(duì)象被整理到堆的底部。如果每一次收集時(shí)進(jìn)行徹底的整理,那么得到的堆就類(lèi)似于復(fù)制收集器的結(jié)果,在堆的活躍部分與自由部分有明確的界線(xiàn),這樣分配成本與復(fù)制收集器相當(dāng)。長(zhǎng)壽的對(duì)象趨向于沉在堆的底部,這樣就不會(huì)像在復(fù)制收集器中那樣反復(fù)復(fù)制它們。實(shí)驗(yàn)表明,標(biāo)記整理算法的總體執(zhí)行效率高于標(biāo)記清除算法,又不像復(fù)制算法那樣需要犧牲一半的存儲(chǔ)空間。1.2JavaHotSpot虛擬機(jī)的GC算法隨著科學(xué)研究和應(yīng)用實(shí)踐的不斷深入,人們逐漸意識(shí)到,一個(gè)理想的垃圾收集器不應(yīng)在運(yùn)行時(shí)導(dǎo)致應(yīng)用程序的暫停,不應(yīng)額外占用大量的內(nèi)存空間和CPU資源,而上述的垃圾收集算法都無(wú)法滿(mǎn)足這些
7、要求。人們必須提出更新的算法或思路,以解決實(shí)踐中碰到的諸多難題。SUN公司在每次發(fā)布的新版JDK中都為其中的垃圾收集器做了一些改進(jìn)。以下主要討論HotSpotJVM出現(xiàn)以后的GC算法。JVM1.2及以后版本使用的技術(shù)稱(chēng)為分代垃圾收集generationalgarbagecollection,這種方法是基于一個(gè)事實(shí),絕大多數(shù)對(duì)象是生命周期較短的對(duì)象。虛擬機(jī)將堆劃分為兩部分,一個(gè)年老代,用于存放生存期比較長(zhǎng)的對(duì)象;一個(gè)年輕代,用于存放新建的且生存期短暫的對(duì)象實(shí)際上,還有第三部分,永久空間,用于存