《Java效能優化權威指南》的邊邊角(3)——生存代和記憶體洩漏

丁曉昀發表於2014-02-12

《Java效能優化權威指南》的邊邊角(3)——生存代和記憶體洩漏

本文摘自《Java效能優化權威指南》第5章“Java應用效能分析”,這一章介紹了Java應用效能分析的基本概念。本文節選的是正文裡穿插的一個小TIP。


為了理解記憶體分析結果檢視中代的這一列的含義,你必須瞭解Java虛擬機器的垃圾收集過程。每次垃圾收集器執行時,一個物件或者是存活下來,繼續佔用堆記憶體,或者是被移除,其記憶體也被釋放。如果存活下來,則它的年齡會加1。換句話說,可以把物件的年齡簡單理解為它經歷過的垃圾收集次數。

代的個數是不同的物件年齡數。例如,應用程式第一次啟動時為幾個物件分配了空間。應用程式執行過程中,又分配了另外一組物件。最後有一些物件被分配,並只經歷了一次垃圾收集。如果整個執行過程中,垃圾收集器執行了80次,第一組的所有物件的年齡為80,第二組中所有物件的年齡為40,第三組中所有物件的年齡為1,那麼,代的個數的值就為3,因為堆上所有物件只有三個不同的年齡,分別是:80、40以及1。

在大多數Java應用程式中,代的個數最終會穩定下來。這是因為應用程式的持久物件已經分配完成。由於生命週期較短的物件很快會被垃圾收集所以不會對代的個數產生影響。

如果應用程式中代的個數隨著程式執行持續增長,那很可能是發生了記憶體洩漏。換句話說,應用程式隨著時間推進不斷地分配物件,每一個物件都有不同的年齡,因為它們所經歷的垃圾收集週期數不一樣。如果物件被正確回收,不同物件年齡的數目不會持續增長。

《Java效能優化權威指南》的邊邊角(4)——封面吉祥物Duke

相關文章