內(nèi)存管理是影響軟件應(yīng)用程序性能的一個(gè)重要因素。與實(shí)際的數(shù)據(jù)計(jì)算時(shí)間相比,分配和卸載內(nèi)存所用的時(shí)間更長。
雖然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)存。在大型Java應(yīng)用程序中,垃圾收集暫停可能持續(xù)幾秒鐘,這段時(shí)間足以中斷任何類型的實(shí)時(shí)通信或控制系統(tǒng)。
因此,垃圾收集提供的內(nèi)存提取要求一些開發(fā)者更仔細(xì)地考慮內(nèi)存管理問題。即使Java并沒有提供和C++同等級(jí)別的內(nèi)存分配控制,編程模式仍然會(huì)對(duì)Java應(yīng)用程序的內(nèi)存性能產(chǎn)生重大影響。
在本文中,我將簡單回顧一下Java 5.0的垃圾收集調(diào)整功能。
Java 5.0垃圾收集原理
Java 1.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ī)范內(nèi)執(zhí)行。如果一個(gè)大型應(yīng)用程序出現(xiàn)擴(kuò)充,產(chǎn)生大量線程、處理器、套接字和許多內(nèi)存,就會(huì)出現(xiàn)例外。
如果一個(gè)對(duì)象再也不能通過運(yùn)行程序中的任何指針到達(dá),則視其為垃圾。最直接的垃圾收集運(yùn)算法則簡單地在每個(gè)可到達(dá)的對(duì)象間迭代。那么,剩下的對(duì)象即為垃圾。這一方法所用的時(shí)間與活動(dòng)對(duì)象的數(shù)目成比例關(guān)系,且禁止用于維護(hù)許多活動(dòng)數(shù)據(jù)的大型應(yīng)用程序。
從Java 2開始,虛擬機(jī)合并了許多應(yīng)用分代收集組合的各種收集運(yùn)算法則。盡管簡單的垃圾收集檢查堆中的每一個(gè)活動(dòng)對(duì)象,但分代收集利用多數(shù)應(yīng)用程序的幾個(gè)憑經(jīng)驗(yàn)觀察得到的特性來避免額外工作。這些觀察得到的特性中最為重要的一個(gè)就是所謂的早期失效率。許多對(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ì)象在那里死亡。
如果垃圾收集器成為瓶頸,你可能希望自定義代的大小。詳細(xì)檢查垃圾收集器的輸出,然后探究單個(gè)性能計(jì)量單位對(duì)垃圾收集器參數(shù)的靈敏度。
初始化時(shí),保留一個(gè)最大的地址空間,在必要時(shí)才分配給物理內(nèi)存。為對(duì)象內(nèi)存保留的全部地址空間可分為新生代和舊生代。新生代由eden和兩個(gè)生存空間組成。對(duì)象最初分配到eden中。任何時(shí)候,一個(gè)生存空間為空,并作為下一個(gè)空間的目的地,在eden與另一個(gè)生存空間中復(fù)制活動(dòng)對(duì)象的集合。對(duì)象以這種方式在生存空間中復(fù)制,直到它們老化,或復(fù)制到舊生代中。與舊生代關(guān)系密切的第三個(gè)代稱為永生代。這是一個(gè)特別的代,因?yàn)樗A籼摂M機(jī)所需要的數(shù)據(jù),來描述在Java語言中沒有等同物的對(duì)象。例如,描述類與方法的對(duì)象存儲(chǔ)在永生代中。
性能因素
Java應(yīng)用程序(特別是垃圾收集)有兩個(gè)性能計(jì)量單位:吞吐量與暫停。吞吐量是指在一段較長時(shí)間內(nèi),沒有用于垃圾收集的時(shí)間百分比。吞吐量包括用于分配的時(shí)間(但用于調(diào)整分配速度的時(shí)間一般不包括在內(nèi))。暫停是應(yīng)用程序因?yàn)槔占霈F(xiàn)的停頓時(shí)間。
一些用戶還對(duì)其他因素較為敏感。例如,占用率(footPRint) 是一批工作進(jìn)程的集合,以頁和緩沖行數(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)用(RMI)中的重要因素。
通常來說,特定的代大小選擇這些因素之?
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注