java day tokyo 2013 java the night - g1gcvisualizer -
DESCRIPTION
This slide is introduction about the G1GC Visualizer at Java The Night, Java Day Tokyo 2013.TRANSCRIPT
G1GCを可視化してみました- G1GC Visualizer -
徳益芳郎 (某メーカー勤務)
Java Day Tokyo 2013Java The Night
なぜ、可視化したの?昨年夏、社内勉強会で G1GC を説明するために...
G1GCの資料を読んでみた
へぇー
G1GC の各世代管理各世代は Region の集合で表現
各世代の Region は必要なときに必要なだけ確保
Permanent 領域は
Region 単位の管理外
Old
Humongous
Survivor
Eden
Eden
Eden
EdenEden
Survivor
Permanent
Old
Old
Old
Old Old Old Old
OldOld
Old
Old
Old Old OldOld
Old
Old
Old Old
退避 GC
Old
Humongous
Permanent
Old
Old
Old
Old Old Old Old
OldOld
Old
Old
OldOld
Old
Old
Old Old
Eden
Eden EdenEden
Survivor
Old Old
Collection Set 内の Lived オブジェクトを他の Region に退避する
Eden
Old
Humongous
Permanent
Old
Old
Old
Old Old Old
OldOld
Old
Old
OldOld
Old
Old
Old Old
Survivor Old
Old Old
Evacuate
Eden
Eden EdenEden
Survivor Eden
なんとなく解ったけど...やっぱり、動かして確認しよう!
Java VisualVM で観てみた
でも、期待と違った!
Old
Humongous
Survivor
Eden
Eden
Eden
EdenEden
SurvivorOld
Old
Old
Old Old Old Old
OldOld
Old
Old
Old Old OldOld
Old
Old
Old Old
?Region管理を
イメージできない!
....
311.040: [GC pause (young) (initial-mark), 0.00690255 secs] [Parallel Time: 6.6 ms] [GC Worker Start (ms): 311039.8 311039.8 311039.9 311045.7 Avg: 311041.3, Min: 311039.8, Max: 311045.7, Diff: 5.8] [Ext Root Scanning (ms): 3.0 4.0 5.0 0.0 Avg: 3.0, Min: 0.0, Max: 5.0, Diff: 5.0] [Update RS (ms): 1.6 0.7 0.1 0.0 Avg: 0.6, Min: 0.0, Max: 1.6, Diff: 1.6]
...
Avg: 0.1, Min: 0.0, Max: 0.1, Diff: 0.1] [Termination Attempts : 1 1 1 1 Sum: 4, Avg: 1, Min: 1, Max: 1, Diff: 0] [GC Worker End (ms): 311045.7 311045.7 311045.7 311045.7 Avg: 311045.7, Min: 311045.7, Max: 311045.7, Diff: 0.0] [GC Worker (ms): 5.9 5.9 5.8 0.0 Avg: 4.4, Min: 0.0, Max: 5.9, Diff: 5.9] [GC Worker Other (ms): 0.8 0.8 0.8 6.6 Avg: 2.2, Min: 0.8, Max: 6.6, Diff: 5.9] [Clear CT: 0.0 ms] ....
GCログを出力してみた-XX:+UseG1GC -Xloggc:<file> -XX:+PrintGCDetails
-XX:+UnlockDiagnosticVMOptions -XX:+G1PrintHeapRegions
....
G1HR ALLOC(Eden) 0x04c00000 G1HR ALLOC(Eden) 0x04000000 G1HR ALLOC(Eden) 0x05c00000 G1HR ALLOC(Eden) 0x04600000 G1HR ALLOC(Eden) 0x05d00000 G1HR #StartGC 261 G1HR CSET 0x04600000 G1HR CSET 0x05c00000 G1HR CSET 0x04000000 G1HR CSET 0x04c00000 G1HR CSET 0x04900000 G1HR REUSE 0x05500000 G1HR ALLOC(Survivor) 0x04b00000 G1HR RETIRE 0x04b00000 0x04b313d0 G1HR RETIRE 0x05500000 0x0553aa60 G1HR #EndGC 261 ....
Old
Humongous
Survivor
Eden
Eden
Eden
EdenEden
SurvivorOld
Old
Old
Old Old Old Old
OldOld
Old
Old
Old Old OldOld
Old
Old
Old Old
?やっぱり、Region管理をイメージできない!
だったら...
自分で可視化しよう!
せっかくなので JavaFX で作っちゃおう!
で、作ってみた...
....
G1HR ALLOC(Eden) 0x04c00000 G1HR ALLOC(Eden) 0x04000000 G1HR ALLOC(Eden) 0x05c00000 G1HR ALLOC(Eden) 0x04600000 G1HR ALLOC(Eden) 0x05d00000 G1HR #StartGC 261 G1HR CSET 0x04600000 G1HR CSET 0x05c00000 G1HR CSET 0x04000000 G1HR CSET 0x04c00000 G1HR CSET 0x04900000 G1HR REUSE 0x05500000 G1HR ALLOC(Survivor) 0x04b00000 G1HR RETIRE 0x04b00000 0x04b313d0 G1HR RETIRE 0x05500000 0x0553aa60 G1HR #EndGC 261 ....
なんとなくイメージできた!?
Region の状態を可視化
Permanent 領域の可視化は対象外
Permanent
G1GC イベントも可視化COMMIT / UNCOMMIT ヒープ領域の拡張・縮退ALLOC / ALLOC-FORCE 各世代への Region 割当
CSET 退避する Region の選定RETIRE Region の満杯前に退避終了REUSE 退避先として既存 Regionを再利用CLEAN CMS による Region の開放
POST-COMPACTION Full GC による Region 開放EVAC-FAILRE Region 退避の失敗
Demo
終わり