garbage first garbage collection (g1 gc) #jjug_ccc #ccc_cd6
TRANSCRIPT
Garbage First GC
KUBOTA Yuji @sugarlife
NTT OSSセンタ Copyright©2015 NTT corp. All Rights Reserved.
2015/11/28
JJUG CCC 2015 Fall #ccc_cd6
はじめに
• 本セッションでは Garbage First
GC (G1 GC) について、ログから動作状況を把握できる、主に開発者・運用者向けの知識の土台作りを目標としています
体系的な知識の土台作りが目標 Copyright©2015 NTT corp. All Rights Reserved. 3
おやくそく
• 本セッション (スライド) における表現は全て個人の見解です
• 以下の JVM 実装に基づきます
–HotSpot VM (OpenJDK 8)
–repo jdk8u/jdk8u-dev/hotspot
•changeset 7664:831754f092fb(zip)
動作確認は jdk8u66 でやりました Copyright©2015 NTT corp. All Rights Reserved. 4
KUBOTA Yuji @sugarlife
• OpenJDK テクニカルサポート
–コア解析からGCチューニング, etc…
• 解析支援ツール HeapStats 開発
–多数の商用で元気に稼働中 :)
• 難聴者
–資料的なスライドを多用します
過去にCMS GC, Jigsaw, HeapStats を発表 Copyright©2015 NTT corp. All Rights Reserved. 5
NTT OSSセンタ • NTT グループの OSS 活用を支える部隊
*)OSSVERT®:OSs Suites VERified Technically(技術検証済みOSS組合せ)
事業会社
SI会社 問合せ対応、導入支援、保守等
技術検証、 導入推進
プロダクト/ ツール類開発
技術者育成、人材交流
各種
OSS コミュニティ
設計, 開発, 運用
グループ各社 サポートベンダ、
NTT 研究所等 お
客様
サポー ト連携
開発 連携
①OSSトータル サポート
NTT OSSセンタ
②OSS適用推進 (OSSVERT®*検証)
③技術開発 (DBMS,高可用ミドル等)
④ソフトウェア 基盤技術力向上
Kernel, PostgreSQL, Pacemaker, Tomcat, etc Copyright©2015 NTT corp. All Rights Reserved. 6
OpenJDK Contributes
Copyright©2015 NTT corp. All Rights Reserved. 7
暗号化 zip 操作 API を提案中!
興味ある人は是非MLへ!
Garbage Collection
1. 不要なメモリ領域(ゴミ)を判別し、
2. ゴミを処理して再利用可能にする
面倒なメモリ管理は JVM に任せたい Copyright©2015 NTT corp. All Rights Reserved. 9
HotSpot VM の GC
• Serial GC, Parallel GC
–初期GC, JDK8 以前はデフォルト
• Concurrent Mark-Sweep GC
–JDK1.4.1 から導入 (出典:JDK-4758307)
• Garbage First GC
–JDK7 から導入, JDK9からデフォルト
細かく言えば他にもあるけど主流はこれら Copyright©2015 NTT corp. All Rights Reserved. 10
Parallel と Concurrent
ケースバイケースで GC を選択しましょう Copyright©2015 NTT corp. All Rights Reserved. 11
Parallel (Serial =
Threadが1つ)
Concurrent (実際は部分的に停止するMostly)
Application
Thread
GC Thread
アプリケーション停止=Stop The World (STW)
メモリ管理
今回はPerm/Metaspace等は細かく見ません Copyright©2015 NTT corp. All Rights Reserved. 12
Heap Perm
/
Meta
space
Heap (ヒープ)
Copyright©2015 NTT corp. All Rights Reserved. 13
Heap
オブジェクトが配置される Heap を巨大な
一つのデータ構造として扱うのは非効率
ヒープ管理 (従来)
Copyright©2015 NTT corp. All Rights Reserved. 14
Eden Old
Survivor
0
Survivor
1
というわけで、Java (JVM)は世代別に分けて
それぞれ異なる GC で管理しています
Young
ヒープ管理 (従来)
Copyright©2015 NTT corp. All Rights Reserved. 15
Eden Old
Survivor
0
Survivor
1
ヒープが巨大化すると結局非効率になります
そこで G1 はヒープ構造を変更しました
Young
Heap Layout (G1)
Copyright©2015 NTT corp. All Rights Reserved. 16
G1 では Region と呼ばれる空間に
ヒープを等しく分割して管理してます
Heap Layout (G1)
Copyright©2015 NTT corp. All Rights Reserved. 17
Region のサイズは初期ヒープサイズに
依存しますが -XX:G1HeapRegionSize で
1~32MBの範囲で変更が可能です
Heap Layout (G1)
Copyright©2015 NTT corp. All Rights Reserved. 18
Region のサイズは初期ヒープサイズに
依存しますが -XX:G1HeapRegionSize で
1~32MBの範囲で変更が可能です
Regionサイズの半分以上の単体オブジェクトは
「Humongous Object」として扱われます
世代分け
Copyright©2015 NTT corp. All Rights Reserved. 19
E
O
S
O
O
S
S
E
O
E
O
O
E
S
O
O O
O
O
E
E
O
水:Eden 橙:Survivor 緑:Old 藍:未使用
G1 GC も他 GC と同じく世代別 GC です
Young (Eden, Survivor) 対象の Young GC
Young + Old (Tenure) 対象の Mixed GC
そして G1 GC が失敗した時の Full GC
Humongous Object
Copyright©2015 NTT corp. All Rights Reserved. 20
E
O
S
O
O
S
S
E
H
O
E
O
O
E
S
O
O O
O
H
O
E
E
O
Humongous Object が生成された場合は
専用の Region にアロケートされます
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Humongous Object
Copyright©2015 NTT corp. All Rights Reserved. 21
E
O
S
O
O
S
S
E
H
O
E
O
O
E
S
O
O O
O
H
O
E
E
O
Humongous Object が生成された場合は
専用の Region にアロケートされます
アロケート時に GC 発生の可能性がある上、
メモリ獲得コストも高いので極力生成は避ける
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Garbage First の所以
Copyright©2015 NTT corp. All Rights Reserved. 22
E
O
S
O
O
S
S
E
O
E
O
O
E
S
O
O O
O
O
E
E
O
H
H 1. 各Regionの不要オブジェクト量は異なる
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Garbage First の所以
Copyright©2015 NTT corp. All Rights Reserved. 23
E
O
S
O
O
S
S
E
O
E
O
O
E
S
O
O O
O
O
E
E
O
H
H 1. 各Regionの不要オブジェクト量は異なる
2. GC による回収はコスト(STW)が発生する
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Garbage First の所以
Copyright©2015 NTT corp. All Rights Reserved. 24
E
O
S
O
O
S
S
E
O
E
O
O
E
S
O
O O
O
O
E
E
O
H
H 1. 各Regionの不要オブジェクト量は異なる
2. GC による回収はコスト(STW)が発生する
不要オブジェクト(ゴミ)が多いRegionだけ
GC して処理時間を(できるだけ)抑える=G1
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Garbage First の所以
Copyright©2015 NTT corp. All Rights Reserved. 25
E
O
S
O
O
S
S
E
T
E
O
O
T
E
S
T
O O
O
O
E
E
O
H
H 1. 各Regionの不要オブジェクト量は異なる
2. GC による回収はコスト(STW)が発生する
不要オブジェクト(ゴミ)が多いRegionだけ
GC して処理時間を(できるだけ)抑える=G1
アプリケーションを止めないコンカレント
サイクルでマーキングを実施する
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Garbage First の所以
Copyright©2015 NTT corp. All Rights Reserved. 26
E
O
S
O
O
S
S
E
T
E
O
O
T
E
S
T
O O
O
O
E
E
O
H
H 1. 各Regionの不要オブジェクト量は異なる
2. GC による回収はコスト(STW)が発生する
不要オブジェクト(ゴミ)が多いRegionだけ
GC して処理時間を(できるだけ)抑える=G1
アプリケーションを止めないコンカレント
サイクルでマーキングを実施する
-XX:MaxGCPauseMillis で指定した値を
目安に前向きに善処 (デフォルト 200ms)
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
まとめ
Copyright©2015 NTT corp. All Rights Reserved. 27
• ヒープレイアウト –従来と同じく世代別に領域を分ける。ただし、巨大ヒープを効率的に処理するため、Region に細分化
• G1 処理 –マーキングはコンカレントサイクル
–Young GC と Mixed GC の世代別GC
–失敗した場合は Full GC が発生する
ゴミの多い場所を優先してやるから G1 GC
Copyright©2015 NTT corp. All Rights Reserved. 29
以降のログ出力に利用したオプションです
G1 使用時の推奨値とは別なのに注意
ログについて
使用した Java 起動オプション -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintGCDateStamps
見やすいようにタイムスタンプを除外し、一部省略や改行をしています
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 30
オブジェクトの生成
E E
生成オブジェクトは Eden に配置され、
Eden が一杯になると Young GC が発生
O
O
S
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 31
オブジェクトの生成
E E
生成オブジェクトは Eden に配置され、
Eden が一杯になると Young GC が発生
O
O
E
S
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 32
オブジェクトの生成
E E
生成オブジェクトは Eden に配置され、
Eden が一杯になると Young GC が発生
O
O
E E
S
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 33
Young GC
E E
Young GC が発生した際はこの形式の
ログが出力。GC Causeは複数種類あります
O
O
E E
S
H [GC pause (G1 Evacuation Pause) (young), 0.0650323 secs]
GC発生原因(GC Cause) young/mixed 識別箇所
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 34
Young GC
E
E E
E
O
O
S
全 Eden / Survivor をスキャンし、生存オブジェクトを新Survivorに退避 (Evacuation)
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 35
Young GC
E
S
E S E
S
E
O
O
S
全 Eden / Survivor をスキャンし、生存オブジェクトを新Survivorに退避 (Evacuation)
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 36
Young GC
E
S
E S E
S
E
O
O
S
H
Survivor の一部のオブジェクトは
(年齢的に) Old に退避する場合もあります
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 37
Young GC
E
S
E S
O
E
S
E
O
O
S
H
Survivor の一部のオブジェクトは
(年齢的に) Old に退避する場合もあります
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 38
Young GC (Survivor Full)
E
S
E S E
S
E
O
O
S
H
もし退避先の Survivor に生存オブジェクト
を退避させるスペースがなかった場合は、
Eden から直接 Old 領域に退避することも
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 39
Young GC (Survivor Full)
E
S
E S E
S
E
O
O
S
H
もし退避先の Survivor に生存オブジェクト
を退避させるスペースがなかった場合は、
Eden から直接 Old 領域に退避することも
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 40
Young GC (Survivor Full)
E
S
E S E
S
E
O
O
S
H
もし退避先の Survivor に生存オブジェクト
を退避させるスペースがなかった場合は、
Eden から直接 Old 領域に退避することも
O
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 41
Young GC 後
O
Eden / Survivor元 (from) に割り当てていた
Region を解放して不要オブジェクトを回収
S
S
S O
O H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 42
ログと大まかな処理の流れ [GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
一連のログを全部表示すると、このように
インデントでグルーピングされています
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 43
ログと大まかな処理の流れ
特に重要なのは先頭と末尾
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 44
ログと大まかな処理の流れ
[GC pause (<GCCause>) (young), 0.0650323 secs] : : [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
各領域のサイズと停止(STW)時間が解ります
Young GC 確認
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 45
ログと大まかな処理の流れ
[GC pause (<GCCause>) (young), 0.0650323 secs] : : [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
GC前 使用量(容量) -> GC後 使用量(容量)
実 STW 時間
各領域のサイズと停止(STW)時間が解ります
Young GC 確認
Copyright©2015 NTT corp. All Rights Reserved. 46
ログと大まかな処理の流れ [GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
このグループは GC Worker による生存オブジェクトのスキャンと退避処理のログです
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 47
ログと大まかな処理の流れ
[Parallel Time: 38.6 ms, GC Workers: 10] [<ラベル>: Min:<最小>, Avg:<平均>, Max:<最大>, Diff:<最大-最少>, Sum:<全 Worker の合計値>]
Worker数
この様な形式で各ラベルごとに
並列処理に懸った時間が出力されます
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 48
ログと大まかな処理の流れ
[Parallel Time: X ms, GC Workers: Y] [<ラベル>: Min:<最小>, Avg:<平均>, Max:<最大>, Diff:<最大-最少>, Sum:<全 Worker の合計値>]
Worker数
GC Worker処理のラベルとその内容はこちら
[GC Worker Start]:開始タイムスタンプ (VM起動時間)
[Ext Root Scanning]:Heapの Root Region のスキャン
[Update RS],[Scan RS]:RS(Remember Set, 新規オブジェ
クトが配置されたリージョンのコレクション)のスキャン
[Code Root Scanning]:Code Cache のスキャン
[Object Copy]:Evacuation、退避処理
[Termination]:他スレッド処理を steal して処理した時間
[GC Worker Other]:処理時間に計上されない内部処理
[GC Worker Total]:Start から End までの時間
[GC Worker End]:終了タイムスタンプ (VM起動時間)
[GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
Copyright©2015 NTT corp. All Rights Reserved. 49
ログと大まかな処理の流れ
オブジェクト情報を保持する構造の掃除など
[Code Root Fixup: X ms] [Code Root Purge: X ms] [Clear CT: X ms]
Copyright©2015 NTT corp. All Rights Reserved. 50
ログと大まかな処理の流れ [GC pause (G1 Evacuation Pause) (young), 0.0650323 secs] [Parallel Time: 38.6 ms, GC Workers: 10] [GC Worker Start (ms): Min: 27181.9, Avg: 27182.2, Max: 27184.0, Diff: 2.1] [Ext Root Scanning (ms): Min: 0.0, Avg: 0.9, Max: 1.9, Diff: 1.9, Sum: 8.8] [Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.5, Diff: 0.5, Sum: 1.1] [Processed Buffers: Min: 0, Avg: 0.8, Max: 3, Diff: 3, Sum: 8] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3] [Code Root Scanning (ms): Min: 0.5, Avg: 1.0, Max: 1.8, Diff: 1.2, Sum: 9.7] [Object Copy (ms): Min: 15.2, Avg: 16.6, Max: 17.4, Diff: 2.3, Sum: 166.0] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 2.4] [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3] [GC Worker Total (ms): Min: 17.0, Avg: 18.9, Max: 19.1, Diff: 2.1, Sum: 188.6] [GC Worker End (ms): Min: 27201.0, Avg: 27201.0, Max: 27201.0, Diff: 0.0] [Code Root Fixup: 1.0 ms] [Code Root Purge: 0.1 ms] [Clear CT: 1.4 ms] [Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms] [Eden: 224.0M(224.0M)->0.0B(196.0M) Survivors: 0.0B->28.0M Heap: 228.9M(4500.0M)->48.5M(4500.0M)] [Times: user=0.26 sys=0.08, real=0.06 secs]
[Other: 23.9 ms] [Choose CSet: 0.0 ms] [Ref Proc: 21.4 ms] [Ref Enq: 0.2 ms] [Redirty Cards: 1.2 ms] [Humongous Register: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.4 ms]
それ以外の処理
GC対象Regionセット収集
強参照以外の処理と収集
Dirty Card の再処理
Humongousの処理と解放
GC対象Regionセットの解放
Copyright©2015 NTT corp. All Rights Reserved. 51
Young GC 後
O
S
S
S O
O H
Young GC 編おしまい
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 52
複数回の Young GC 後
O
S
O
O
O O
S
S
Heap の使用率が閾値を超えると
Marking Cycle が発生
O
O
O
O
O
O
E
E
E
E
H
O
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 53
Marking Cycle
O
O S
O
O
O O
S
S
Heap の使用率が閾値を超えると
Marking Cycle が発生
O
O
O
O
O
O
E
E
E
E
H Young GC or Humongous 配置後のヒープ
使用率がデフォルトで 45% 超えると発生
-XX:InitiatingHeapOccupancyPercent で設定可
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 54
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
Marking Cycle のログ全容 (ラベルで判断)
Copyright©2015 NTT corp. All Rights Reserved. 55
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
マーキングサイクルの開始
Copyright©2015 NTT corp. All Rights Reserved. 56
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
Root Region を決定 (initial-mark)
Copyright©2015 NTT corp. All Rights Reserved. 57
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
Root Region をスキャン
(concurrent-root-region-scan)
Copyright©2015 NTT corp. All Rights Reserved. 58
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
参照を辿ってマーク (concurrent-mark)
Copyright©2015 NTT corp. All Rights Reserved. 59
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
漏れを防ぐために全スレッド止めて再マーク
Copyright©2015 NTT corp. All Rights Reserved. 60
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC のログがここに入るケースが多い) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
漏れを防ぐために全スレッド止めて再マーク
Finalize Marking: 強参照の再マーク GC ref-proc: 強参照「以外」のマーク Unloading: クラスアンロード処理
Copyright©2015 NTT corp. All Rights Reserved. 61
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
生存オブジェクトのない Region 回収など
Copyright©2015 NTT corp. All Rights Reserved. 62
Marking Cycle ログ [GC pause (<GCCause>) (young) (initial-mark), 0.00554820 secs] :(Young GC のログ) → 最後に [Times:… real=X.XX secs] [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0566056 secs] [GC concurrent-mark-start] :(0 以上の Young GC が発生する) [GC concurrent-mark-end, 1.6776461 secs] [GC remark [Finalize Marking, 0.0000801 secs] [GC ref-proc, 0.0000749 secs] [Unloading, 0.0007663 secs], 0.0010696 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC cleanup 16G->14G(32G), 0.0557430 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC concurrent-cleanup-start] [GC concurrent-cleanup-end, 0.0222541 secs]
Concurrent ではない処理は STW が発生する
Copyright©2015 NTT corp. All Rights Reserved. 63
Marking Cycle 後
参照追跡を完了し、各 Region ごとの生存オブジェクト情報を得て Mixed GC を起動
O
O S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 64
Mixed GC
O
O S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
アルゴリズム(とログ)は Young GC と一緒
[GC pause (G1 Evacuation Pause) (mixed), 0.0640122 secs]
GC発生原因(GC Cause) ここが mixed になるだけ
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 65
Mixed GC と Young GC の違い
O
O S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
JDK-8059452 でデフォルト値が変更
ゴミが多い Region を対象に GC する ・全ての Eden, Survivor と、生存オブジェクトが閾値
(デフォルト 85%) を下回る Old Region が GC 対象。
-XX:G1MixedGCLiveThresholdPercent で設定可能
条件達成まで複数回起動する ・回収可能な Old Regionの不要オブジェクトが、ヒープ全体の閾値(デフォルト 5%)以下になるまで繰り返す。-XX:G1HeapWastePercent で設定可能
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 66
Mixed GC
O
O S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
全ての Eden, Survivor から新たな Survivor、選択された Old から新たな Old へ退避する
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 67
Mixed GC
全ての Eden, Survivor から新たな Survivor、選択された Old から新たな Old へ退避する
O
O S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
O 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 68
Mixed GC
全ての Eden, Survivor から新たな Survivor、選択された Old から新たな Old へ退避する
O
O
S
O S
S
S
O
O
O O
S
S
O
O
O
O
O
O
E
E
E
E
H
O 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 69
Mixed GC 後
O S
O
S
S
O
O
O O
O
O
O
O
O
O
H
退避元 Eden, Survivor, Old の Region を回収条件達成してなければ次の Mixed GC へ
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 70
Mixed GC 停止後
S
S
O
O
O
S
O
O
O
O
O
O
H
最終的にゴミが多かった Old Region が
全て回収されて Mixed GC が停止する
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
まとめ
Copyright©2015 NTT corp. All Rights Reserved. 71
• Young GC と Mixed GC
–アルゴリズム(とログ)は一緒
–大きな違いは GC 対象の Region
–Regionごとの退避と解放の繰り返し
• Marking Cycle
–対象 Region を決めるのに必要な処理を一部コンカレントに行っている
ログもインデントのおかげで慣れると楽です
Copyright©2015 NTT corp. All Rights Reserved. 73
Evacuation Failure
E
S
E S E
S
E
O
O
S
H
O
退避 (Evacuation) 先の Survivor or Old に
退避させるスペースがなく失敗したパターン
Full GC が起動する場合もある
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 74
Evacuation Failure
E
S
E S E
S
E
O
O
S
H
O
ログには (to-space exhausted) と出ます
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用 [GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.0083907 secs] [Parallel Time: 11.7 ms, GC Workers: 10] :
Copyright©2015 NTT corp. All Rights Reserved. 75
Evacuation Failure
E
S
E S E
S
E
O
O
S
H
O
Full GC が起動した場合でも同じです
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用 [GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.0083907 secs] [Parallel Time: 11.7 ms, GC Workers: 10] :
[GC pause (G1 Evacuation Pause) (young) (initial-mark) (to-space exhausted), 0.0045139 secs] : [GC concurrent-mark-start] [Full GC (Allocation Failure) 4429M->113M(4500M), 0.7380897 secs] [Eden: 0.0B(224.0M)->0.0B(2004.0M) Survivors: 0.0B->0.0B Heap: 4429.1M(4500.0M)->113.1M(4500.0M)], [Metaspace: 12003K->12003K(1060864K)] [Times: user=0.78 sys=0.00, real=0.73 secs] [GC concurrent-mark-abort] :
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 76
Evacuation Failure
E
S
E S E
S
E
O
O
S
H
O
[GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.0083907 secs] [Parallel Time: 11.7 ms, GC Workers: 10] :
[GC pause (G1 Evacuation Pause) (young) (initial-mark) (to-space exhausted), 0.0045139 secs] : [GC concurrent-mark-start] [Full GC (Allocation Failure) 4429M->113M(4500M), 0.7380897 secs] [Eden: 0.0B(224.0M)->0.0B(2004.0M) Survivors: 0.0B->0.0B Heap: 4429.1M(4500.0M)->113.1M(4500.0M)], [Metaspace: 12003K->12003K(1060864K)] [Times: user=0.78 sys=0.00, real=0.73 secs] [GC concurrent-mark-abort] :
実 STW 時間
Full GC のログもこれまでと同じ形式です
各空間の
GC前後の
使用量(容量)
GC Cause
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 77
Evacuation Failure
E
S
E S E
S
E
O
O
S
H
O
[GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.0083907 secs] [Parallel Time: 11.7 ms, GC Workers: 10] :
[GC pause (G1 Evacuation Pause) (young) (initial-mark) (to-space exhausted), 0.0045139 secs] : [GC concurrent-mark-start] [Full GC (Allocation Failure) 4429M->113M(4500M), 0.7380897 secs] [Eden: 0.0B(224.0M)->0.0B(2004.0M) Survivors: 0.0B->0.0B Heap: 4429.1M(4500.0M)->113.1M(4500.0M)], [Metaspace: 12003K->12003K(1060864K)] [Times: user=0.78 sys=0.00, real=0.73 secs] [GC concurrent-mark-abort] :
実 STW 時間
各空間の
GC前後の
使用量(容量)
GC Cause 対策案
1. Heap を増やす (Region の個数を増やす)
2. -XX:InitiatingHeapOccupancyPercent を
下げてサイクル頻度を上げる
3. -Xms, -Xmx, -XX:MaxGCPauseMillis 以外を
削除し、over-tuning を回避する
Region 管理の改善が代表的な対策です
Copyright©2015 NTT corp. All Rights Reserved. 78
Humongous Allocation 頻発
E
S
H
H
E S E
H
S
H
E
O
O
S
H
O
H
Humongous Object が大量に生成され、
GC 頻発や処理に時間が懸かるパターン
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 79
Humongous Allocation 頻発
E
S
H
H
E S E
H
S
H
E
O
O
S
H
O
H
[GC pause (G1 Humongous Allocation) (mixed), 0.4331340 secs] : [Other: 0.7 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.2 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.2 ms] [Humongous Register: 260.1 ms] [Humongous Reclaim: 480.7 ms] [Free CSet: 0.1 ms] :
GC Cause が G1 Humongous Allocation の
GC Pause や、Humongous 関連処理の
処理時間から確認します
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 80
Humongous Allocation 頻発
E
S
H
H
E S E
H
S
H
E
O
O
S
H
O
H
[GC pause (G1 Humongous Allocation) (mixed), 0.4331340 secs] : [Other: 0.7 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.2 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.2 ms] [Humongous Register: 260.1 ms] [Humongous Reclaim: 480.7 ms] [Free CSet: 0.1 ms] :
対策案
1. -XX:G1HeapRegionSize で Region サイズを Heap と一緒に増やす。Heap を増やさない場合は Region 数が減り Evacuation
Failure の可能性が増すので注意
2. 巨大なオブジェクトを極力生成しない
(長大な配列、文字列、フィールド数が極端にクラスなど)
Humongous を減らすのが抜本対策
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用
Copyright©2015 NTT corp. All Rights Reserved. 81
CPU 処理時間が長い
Java プロセス以外にも疑うべき範囲が
広がりますが、GC 処理時間が長いパターン
[GC pause (G1 Evacuation Pause) (mixed), 0.8332274 secs] : [Ref Proc: 103.4 ms] : [Times: user=1.25 sys=0.60, real=0.83 secs]
Copyright©2015 NTT corp. All Rights Reserved. 82
CPU 処理時間が長い [GC pause (G1 Evacuation Pause) (mixed), 0.8332274 secs] : [Ref Proc: 103.4 ms] : [Times: user=1.25 sys=0.60, real=0.83 secs]
対策案
1. 物理 CPU コアが余裕なら -XX:ConcGCThreads を増やして並列度を上げる。逆にコア数が少ない、メモリが小さい場合は、従来GCを検討する
2. Reference Processing([Ref Proc]) の時間が長い場合は、
-XX:+ParallelRefProcEnabled を指定して並列処理する。
WeakReference や SoftReference の抑制も検討する
3. -XX:InitiatingHeapOccupancyPercent を上げてサイクル頻度を下げる (副作用もあるので注意)
特にケースバイケースなパターンなので注意
まとめ
Copyright©2015 NTT corp. All Rights Reserved. 83
• Evacuation Failure –ヒープを増やそう
• Humongous Allocation –ヒープを増やそう
• CPU 処理時間が長い –CPUを増やそう(NUMA環境は注意)
ジョークですが G1 が生まれた経緯はこれ
おわりに
Copyright©2015 NTT corp. All Rights Reserved. 84
• 自分のアプリケーションがどのようにメモリを使っているかは意識しましょう
• まずは動かして性能を測定してみてください
• GC に任せるのはそれから
現場に神宿る
References
Copyright©2015 NTT corp. All Rights Reserved. 85
• Detlefs, D., Flood, C., Heller, S., and
Printezis, T. “Garbage-first garbage
collection” (ISMM 2004)
• http://hg.openjdk.java.net/jdk8u/
• jdk8u-dev/hotspot (7664:831754f092fb)
• Getting Started with G1 Garbage
Collector (Oracle Documents)
HeapStats チームや同僚達の支えに感謝