久しぶりにJVMのGCログを確認するためにGCViewerを使ったのでメモを残しておく。
環境
- OS: Windows 8.1
- Java: java version "1.8.0_231"
- Gcviewer: gcviewer-1.36-SNAPSHOT.jar
ダウンロード
以下のページでなるべく最新バージョンの「download | download mac version」のリンクをクリックし、ダウンロードする。
https://github.com/chewiebug/GCViewer/wiki/Changelog
Windowsの場合はjarファイルがダウンロードされるので、任意のフォルダに配置する。
起動
表示の変更
- メニュー > View > Data Panel をチェックオフ
→右側のデータパネルが消えて広くなる
- 時間列の周辺を右クリック > Log start time をチェックオン
→時間列が時刻表示になる(GCログにタイムスタンプが入っている場合)
- Total Heapをチェックオン
→トータルヒープサイズが赤で表示される
ここでは-Xms(開始サイズ)と-Xmx(最大サイズ)を同値に設定しているため、トータルヒープサイズは横一直線になっている。
- Total Heapをオフにし、Tenured Generation, Young Generationをチェックオン
→Young世代のサイズが黄色で、Tenured世代(Old世代)のサイズが紫で表示される。
通常、Young Generation + Tenured Generation = Total Heap
- Used Tenured Heap, Used young Heapをチェックオン
→各世代の中のヒープ使用量が線で見えるようになる。縦線はGCによってメモリが解放されたことを表す。
- GCログの開始/終了がウィンドウ全体に納まるように上部のセレクトボックスで比率を調整する(★重要)。
これをしないと、一部の範囲しか確認せずに問題ないと思っていしまう可能性がある。今回はこのタイミングで比率を調整したが、なるべく早めにやって全体を見れる状態にしてから調査を始めたほうがよい。
グラフからわかること
- Young GCが結構頻繁に発生している。Yong GCによってYoung世代はほぼ解放される(灰色の線が黄色領域の下まで落ちている)
- Tenured世代のFull GCが2回発生している。どちらもほぼ下まで落ちているので、解放はできている。その後Tenured領域のメモリが増えていっているのが気になる。おそらくこの後再度Full GCが発生するが、その時に下まで解放されれば問題はないのではないか(自信なし)
- Used Heapをチェックオン
→これまではYoung世代とTenured世代を別々に表示していたが、これでYoung世代とTenured世代の合計(=ヒープ使用量)が青で見れるようになる
- Full GC Linesをチェックオン
→Full GCが黒線で見えるようになる
チェック観点
- Young世代のヒープ使用量が、Young GC後に下まで下がっているか。
- Tenured世代のヒープ使用量が、Full GC後に下まで下がっているか。
私自身、実はGCログの評価方法はよくわかっていない。
このグラフではTenured世代が増えてきているが、次のFull GCで下まで解放されれば良い、のかな?