2017-09-06 51 views
2

我檢查Java GC日誌,但GC類型有些奇怪。我的測試應用程序上運行的Java 8u121 64與這些JVM命令行GC選項:Java GC日誌對主要和完整GC不太明顯 - 串行收集器

-XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps 

有來自GC日誌片斷:

2017-09-05T22:16:44.677+0200: 1.581: [GC (Allocation Failure) 2017-09-05T22:16:44.678+0200: 1.581: [DefNew: 139765K->17429K(157248K), 0.0936400 secs] 362075K->361613K(506816K), 0.0937556 secs] [Times: user=0.08 sys=0.02, real=0.09 secs] 
2017-09-05T22:16:45.177+0200: 2.081: [GC (Allocation Failure) 2017-09-05T22:16:45.177+0200: 2.081: [DefNew: 157184K->157184K(157248K), 0.0000394 secs]2017-09-05T22:16:45.177+0200: 2.081: [Tenured: 344183K->349561K(349568K), 0.0605620 secs] 501368K->500745K(506816K), [Metaspace: 2831K->2831K(1056768K)], 0.0607333 secs] [Times: user=0.06 sys=0.00, real=0.06 secs] 
2017-09-05T22:16:45.239+0200: 2.142: [Full GC (Allocation Failure) 2017-09-05T22:16:45.239+0200: 2.142: [Tenured: 349561K->349547K(349568K), 0.0450676 secs] 506685K->506671K(506816K), [Metaspace: 2831K->2831K(1056768K)], 0.0451294 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

正如你所看到的第一行顯然是一個小GC與DefNew收藏家。 我發現了一篇關於GC日誌here的文章。 基於此,第二行是完整的GC。這似乎是對的,因爲它收集了年輕一代,甚至Metaspace。但是第三行發生了什麼?這個日誌條目說它是一個完整的GC。但它只收集了老一代。看來日誌條目是錯誤的:第二個是完整的gc,第三個是主要的gc。

所以問題是:爲什麼在第三行「完整的GC」標題?

回答

0

第二行實際上是第三行報告集合的一部分。如果您使用的是-XX:+PrintGC,則僅以Full GC報告。

gc日誌記錄將在JDK9中統一 - 請參閱this comparison,這解釋了這些記錄st