JDK8打印並分析GC日誌

1 JDK8打印並分析GC日誌

1.1 打印日誌

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseSerialGC -Xmx1m -Xloggc:./gc-serial.log
參數	功能
-XX:+PrintGC	輸出GC日誌
-XX:+PrintGCDetails	輸出GC的詳細日誌
-XX:+PrintGCTimeStamps	輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps	輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC	在進行GC的前後打印出堆的信息
-Xloggc:gc.log	日誌文件的輸出路徑

使用Serial收集器打印日誌

# JDK相關信息
Java HotSpot(TM) 64-Bit Server VM (25.221-b11) for windows-amd64 JRE (1.8.0_221-b11), built on Jul  4 2019 04:39:29 by "java_re" with MS VC++ 10.0 (VS2010)

# 內存相關信息
Memory: 4k page, physical 16647476k(6953016k free), swap 25560372k(12208608k free)

# 當前使用的JVM參數
CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:InitialHeapSize=1048576 -XX:+ManagementServer -XX:MaxHeapSize=1048576 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC 

# Young GC
2022-01-04T21:59:21.976+0800: 0.058: [GC (Allocation Failure) 2022-01-04T21:59:21.976+0800: 0.058: [DefNew: 512K->63K(576K), 0.0008255 secs] 512K->437K(1984K), 0.0009437 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[當前時間戳:相對時間戳]:[[造成GC的原因]:[時間戳]:[年輕代: 回收前->回收後(年輕代總大小), 耗時] 回收前堆大小->回收後堆大小(堆總大小), 耗時] [用戶耗時, 系統耗時,實際耗時]

# Full GC 
2022-01-04T21:59:22.466+0800: 0.546: [Full GC (Allocation Failure) 2022-01-04T21:59:22.466+0800: 0.546: [Tenured: 1407K->1407K(1408K), 0.0032359 secs] 1983K->1519K(1984K), [Metaspace: 7463K->7463K(1056768K)], 0.0033010 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
格式分析類似於Young GC,打印老年代、元空間使用情況。

# 堆內存使用情況(年輕代、老年代、元空間)
Heap
 def new generation   total 576K, used 566K [0x00000000ffe00000, 0x00000000ffea0000, 0x00000000ffea0000)
  eden space 512K, 100% used [0x00000000ffe00000, 0x00000000ffe80000, 0x00000000ffe80000)
  from space 64K,  84% used [0x00000000ffe80000, 0x00000000ffe8d878, 0x00000000ffe90000)
  to   space 64K,   0% used [0x00000000ffe90000, 0x00000000ffe90000, 0x00000000ffea0000)
 tenured generation   total 1408K, used 1408K [0x00000000ffea0000, 0x0000000100000000, 0x0000000100000000)
   the space 1408K, 100% used [0x00000000ffea0000, 0x0000000100000000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 9091K, capacity 9336K, committed 9472K, reserved 1056768K
  class space    used 1083K, capacity 1154K, committed 1280K, reserved 1048576K
  • 對於不同內存區域,不同垃圾收集器展示名稱不同。例如年輕代:DefNew(Serial收集器)、ParNew(ParNew收集器)、PSYoungGen(Parallel Scavenge收集器)。

CMS收集器

CMS觸發垃圾回收時,打印各個GC環節。

# 初始標記
1.082: [GC (CMS Initial Mark) [1 CMS-initial-mark: 5895K(6848K)] 6267K(9920K), 0.0005152 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
# 併發標記
1.083: [CMS-concurrent-mark-start]
1.086: [CMS-concurrent-mark: 0.004/0.004 secs] [Times: user=0.06 sys=0.00, real=0.00 secs] 
# 併發預清理
1.086: [CMS-concurrent-preclean-start]
1.087: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
# 重新標記
1.087: [GC (CMS Final Remark) [YG occupancy: 693 K (3072 K)]1.087: [Rescan (parallel) , 0.0006206 secs]1.088: [weak refs processing, 0.0000278 secs]1.088: [class unloading, 0.0012325 secs]1.089: [scrub symbol table, 0.0015527 secs]1.091: [scrub string table, 0.0002195 secs][1 CMS-remark: 5895K(6848K)] 6589K(9920K), 0.0037899 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
# 併發清理
1.091: [CMS-concurrent-sweep-start]
1.092: [CMS-concurrent-sweep: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
# 重置
1.093: [CMS-concurrent-reset-start]
1.093: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

G1收集器

# 這是一個年輕代GC,花費了0.0035900。下面的縮進,表示這行日誌的子任務
2020-05-08T14:19:58.598-0800: 5.599: [GC pause (G1 Evacuation Pause) (young), 0.0035900 secs]
   # 並行任務,並行GC花費2.4毫秒,並行階段有8個線程
   [Parallel Time: 2.4 ms, GC Workers: 8]
      # 表示各個GC工作線程在應用啓動多久(毫秒)後啓動。
      # 同時還做了個統計,例如這些GC線程最早啓動的那個線程在應用啓動後847.9毫秒後啓動等
      [GC Worker Start (ms): Min: 5598.7, Avg: 5599.1, Max: 5600.8, Diff: 2.1]
      # 表示各個GC工作線程掃描跟對象花費的時間的統計
      [Ext Root Scanning (ms): Min: 0.0, Avg: 0.3, Max: 0.7, Diff: 0.7, Sum: 2.4]
      # 表示各個GC工作線程更新Remembered Sets花費的時間的統計
      # Remembered Sets是保存到堆中的區域的跟蹤引用。設值方法線程持續改變對象圖,自此引指向一個特定的區域。我們保存這些改變的跟蹤信息到叫作Update Buffers的更新緩存中。Update RS子任務不能併發的處理更新緩存,更新一致所有區域的Remembered Sets
      [Update RS (ms): Min: 0.0, Avg: 0.8, Max: 1.8, Diff: 1.8, Sum: 6.4]
         # 表示每個GC工作線程處理的Update Buffers的數量統計
         [Processed Buffers: Min: 0, Avg: 2.2, Max: 6, Diff: 6, Sum: 18]
      # 每個GC工作線程掃描Remembered Sets花費的時間
      # 一個區域的Remembered Sets包含指向這個區域的引用的相符合的卡片。這個階段掃描這些卡片尋找指向所有這些區域的Collection Set的引用
      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      # 掃描Code Root耗時統計。Code Root是JIT編譯後的代碼裏引用了heap中的對象
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      # 拷貝存活對象到新的Region耗時統計
      [Object Copy (ms): Min: 0.0, Avg: 0.2, Max: 0.4, Diff: 0.4, Sum: 1.7]
      # 各個GC工作線程完成任務後嘗試中斷GC線程到真正中斷的耗時統計
      # 在某個GC線程中斷之前,會檢查其它線程的工作隊列,如果發現依然有任務,會幫助處理,之後再中斷
      [Termination (ms): Min: 0.0, Avg: 0.5, Max: 0.7, Diff: 0.7, Sum: 3.7]
         # 嘗試中斷次數統計
         [Termination Attempts: Min: 1, Avg: 2.4, Max: 12, Diff: 11, Sum: 19]
      # GC工作線程花費在其他工作上的時間統計
      [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.9, Diff: 0.9, Sum: 0.9]
      # 各個GC工作線程花費的時間總和統計
      [GC Worker Total (ms): Min: 0.2, Avg: 1.9, Max: 2.3, Diff: 2.2, Sum: 15.3]
      # 各個GC工作線程線程的結束時間,min|max分別表示第一個|最後一個線程的結束時間。
      [GC Worker End (ms): Min: 5601.0, Avg: 5601.0, Max: 5601.0, Diff: 0.0]
   # 串行任務,修復GC期間code root指針改變的耗時
   [Code Root Fixup: 0.0 ms]
   # 串行任務,清除Code Root耗時
   [Code Root Purge: 0.0 ms]
   # 清除Card Table中的Dirty Card的耗時
   [Clear CT: 0.1 ms]
   # 其他任務
   [Other: 1.1 ms]
      # 爲Collection Set選擇區域所花費的時間
      [Choose CSet: 0.0 ms]
      # 花費在處理引用對象上的時間
      [Ref Proc: 0.7 ms]
      # 引用入隊到ReferenceQueues花費的時間,可用-XX:+ParallelRefProcEnabled,並行處理這一步
      [Ref Enq: 0.0 ms]
      [Redirty Cards: 0.3 ms]
      # 處理超大對象
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      # 釋放Collection Set數據結構花費的時間
      [Free CSet: 0.0 ms]
   # 各個區域的內存變化。
   # 4096.0K:伊甸園當前佔用4096.0K
   # (4096.0K):伊甸園總大小4096.0K
   # 0.0B:收集後,伊甸園佔用將會變成0
   # (4096.0K):伊甸園的目標大小(如有需要,JVM可能會自動增加伊甸園大小)
   [Eden: 4096.0K(4096.0K)->0.0B(4096.0K) Survivors: 1024.0K->1024.0K Heap: 24.3M(30.0M)->20.6M(30.0M)]
 # 用戶耗時、系統耗時、實際耗時
 [Times: user=0.01 sys=0.00, real=0.01 secs] 
# 開始掃描初始標記階段Survivor區的Root Region
2020-05-08T14:19:54.087-0800: 1.087: [GC concurrent-root-region-scan-start]
# 掃描完成
2020-05-08T14:19:54.091-0800: 1.092: [GC concurrent-root-region-scan-end, 0.0049225 secs]
# 2. 併發標記,標記線程數可用-XX:ConcGCThreads指定
2020-05-08T14:19:54.092-0800: 1.092: [GC concurrent-mark-start]
# 併發標記結束
2020-05-08T14:19:54.102-0800: 1.103: [GC concurrent-mark-end, 0.0106528 secs]
# 3. 最終標記(stop the world)
2020-05-08T14:19:54.103-0800: 1.104: [GC remark 2020-05-08T14:19:54.103-0800: 1.104: [Finalize Marking, 0.0028699 secs] 2020-05-08T14:19:54.106-0800: 1.107: [GC ref-proc, 0.0001689 secs] 2020-05-08T14:19:54.106-0800: 1.107: [Unloading, 0.0053988 secs], 0.0087250 secs]
 [Times: user=0.01 sys=0.00, real=0.01 secs] 
# 4. 篩選回收(stop the world)
# 沒有存活對象的Old Region和Humongous Region將被釋放和清空。
# 爲了準備下次GC,在CSets中的Old Regions會根據他們的回收收益的大小排序。
2020-05-08T14:19:54.114-0800: 1.114: [GC cleanup 15M->14M(30M), 0.0006027 secs]
 [Times: user=0.00 sys=0.00, real=0.00 secs] 
# 併發清理開始
2020-05-08T14:19:54.114-0800: 1.115: [GC concurrent-cleanup-start]
# 併發清理結束
2020-05-08T14:19:54.114-0800: 1.115: [GC concurrent-cleanup-end, 0.0000133 secs]

JDK11打印日誌

JDK11版本使用XLog統一管理日誌,只需要一個日誌參數。

-XX:+PrintGCDetails -XX:+UseG1GC -Xmx10m -Xloggc:./gc-serial.log
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章