2009-05-21 112 views
90

我已經配置java將垃圾回收信息轉儲到日誌中(verbose GC)。我不確定日誌中垃圾收集條目的含義。下面列出了這些條目的示例。我搜索了Google,並沒有找到可靠的解釋。Java垃圾回收日誌消息

我有一些合理的猜測,但我在尋找答案,它提供了嚴格的條目數字意義上的定義,並由可信來源支持。所有答案的自動+1引用sun文檔。我的問題是:

  1. PSYoungGen是指什麼?我認爲這與以前的(年輕?)一代有關,但究竟是什麼?
  2. 第二個三連數和第一個三連數有什麼區別?
  3. 爲什麼名字(PSYoungGen)爲第一個三位數字指定,但不是第二個?
  4. 三元組中的每個數字(內存大小)是什麼意思。例如在109884K-> 14201K(139904K)中,是GC 109884k之前的內存,然後減少到14201K。第三個數字如何相關?爲什麼我們需要第二組數字?

8109.128:[GC [PSYoungGen:109884K-> 14201K(139904K)] 691015K-> 595332K(1119040K),0.0454530 秒]

8112.111:[GC [PSYoungGen:126649K-> 15528K(142336K)] 707780K-> 605892K(1121472K),0.0934560 秒]

8112.802:[GC [PSYoungGen:130344K-> 3732K(118592K)] 720708K-> 607895K(1097728K),0.0682690 秒]

+0

整堆,堆的年輕一代部分,小gc如何工作,檢查例如HTTP://www.cubrid。org/blog/dev-platform/understanding-java-garbage-collection/ – MarianP 2015-02-26 13:05:23

回答

83

大部分內容都在GC Tuning Guide中解釋過(無論如何你都會很好地閱讀)。

命令行選項-verbose:gc導致關於堆和垃圾收集信息,以在每個集合進行印刷。例如,這裏是一個大型的服務器應用程序的輸出:

[GC 325407K->83000K(776768K), 0.2300771 secs] 
[GC 325816K->83372K(776768K), 0.2454258 secs] 
[Full GC 267628K->83769K(776768K), 1.8479984 secs] 

這裏我們可以看到兩個小集合,然後一個大集合。箭頭之前和之後的數字(例如,第一行的325407K->83000K)分別表示垃圾收集之前和之後的活動對象的組合大小。在次要收集之後,大小包括一些垃圾(不再活動)但不能回收的對象。這些對象要麼被包含在終身代中,要麼從終身代代或永久代代中被引用。

在括號中(例如,從第一行(776768K)再次)是堆的承諾大小的下一個號碼:的可用於Java對象空間,而不從操作系統請求更多的內存量。請注意,此數字不包含其中一個生存者空間,因爲在任何給定時間只能使用一個空間空間,並且不包含永久生成,該永久生成保存虛擬機使用的元數據。

線上的最後一項(例如,0.2300771 secs)表示執行收集所用的時間;在這種情況下約爲四分之一秒。

第三行主要集合的格式類似。

-verbose:gc產生的輸出的格式有可能在未來的版本中更改。

我不確定爲什麼在你的PSYoungGen中,你改變垃圾收集器了嗎?

+0

哪裏可以找到gc日誌文件? – janwen 2012-11-20 08:14:32

+5

這個答案並沒有真正解決原始問題。我覺得michaeljoseph的回答更好。它解決了Ethan提出的問題,並更好地分解了最初的例子。雖然他的回答中存在兩個問題(他的鏈接現在已經死了,而rafa.ferreria指出了另一個問題),但它不僅僅反芻Oracle文檔。 – Dirk 2014-04-23 17:04:14

116
  1. PSYoungGen是指用於次要集合的垃圾收集器。 PS代表並行清除。
  2. 第一組數字是年輕一代之前/之後的大小,第二組是整個堆。 (Diagnosing a Garbage Collection problem詳細說明了格式)
  3. 名稱指示所討論的產生和收集器,所述第二組是整個堆。

關聯的完整GC的一個例子也顯示了用於舊的和永久代收藏家:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
      [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
      [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs] 

最後,打破你的榜樣日誌輸出的一行:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs] 
  • 107Mb用於GC之前,14Mb用於GC之後,max喲UNG代大小137MB
  • 675Mb堆GC之前使用,GC之後使用581Mb堆,1Gb的最大堆大小
  • 輕微GC發生8109.128秒自JVM開始,把0.04
+8

只是一個小小的評論,'()'之間的值不是最大尺寸,永遠都不是最大尺寸。如果GC不能釋放堆,那麼操作系統將需要更多的空間,這個值將會增加。當然尊重下面定義的限制:-Xmx – 2011-03-03 17:07:58

22

我只是想提一提,可以得到詳細的GC日誌與

-XX:+PrintGCDetails 

參數。然後你會在答案中看到PSYoungGen或PSPermGen輸出。

另外-Xloggc:gc.log似乎會產生像-verbose:gc一樣的輸出,但您可以在第一個中指定一個輸出文件。

用法示例:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory 

可視化數據的更好,你可以嘗試gcviewer(較新的版本可以在github找到)。

注意正確寫入參數,我忘記了「+」,我的JBoss無法啓動,沒有任何錯誤信息!