Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Unified JVM Logging!
KUBOTA Yuji
@sugarlife+
NTT OSSセンタ+
Copyright©2017 NTT corp. All Rights Reserved.+
2017/05+
はじめに!
• 本セッションは Java 9 から変
わる JVM ログの設定方法を把
握することが第一目標です
• Log4J を代表としたロギングの
java.util.logging は扱いません
ここは口頭補足用なので見えなくても OK...
おやくそく!
• 本セッション (スライド) は、
以下の JVM 実装に基づきます
– OpenJDK 9 EA b170 (HotSpot VM)
– jdk9/jdk9/hotspot 12762:b3ee8ab233ed
EA = Ea...
「楽してJVMを学びたい」シリーズを喋ってる人
Copyright©2017 NTT corp. All Rights Reserved.+ 4!
KUBOTA Yuji (@sugarlife)
Java Technical Support ...
Agenda!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行
• お役立ち(?)情報
設定の仕方を覚えて帰りましょう
Copyright©2017 NTT corp. All...
Next!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行
• お役立ち(?)情報
JDK 9 から変わる理由
Copyright©2017 NTT corp. All Rig...
歴史的経緯!
• 元々は標準出力
• ファイルにも出力に対応
• タイムスタンプやより詳細な内
容を出力するように改修
• GCログ、JITコンパイルログな
ど出力される内容(種類)も増加
バージョンを重ねるごとにアドホックに改善
Copyri...
問題点!
• 出力内容に一貫性がない
– コンポーネントごとにまちまち
– メッセージも半固定で柔軟に実装
できない (OpenJDK 開発での問題)
• 設定が多種多様過ぎる
• レベルやカテゴリ制御がない
アドホック過ぎて一貫性が失われた
...
一貫性のない例!
Copyright©2017 NTT corp. All Rights Reserved.+ 9!
[GC	[1	CMS-initial-mark:	2925342K(3853568K)]	2937899K(4160256K)...
一貫性のない例!
マイナーアップデートで変わるのが一番辛い
Copyright©2017 NTT corp. All Rights Reserved.+ 10!
[GC	[1	CMS-initial-mark:	2925342K(3853568...
問題点!
• 出力内容に一貫性がない
– コンポーネントごとにまちまち
• 設定が多種多様過ぎる
– 実行後は変更ができない
• レベルやカテゴリ制御がない
多種多様性が便利なのはその通り
Copyright©2017 NTT corp. Al...
PrintXX, TraceXX だけでも 66 種類ある(8u131)
Copyright©2017 NTT corp. All Rights Reserved.+ 12!
PrintAdaptiveSizePolicy+
PrintCMSI...
設定の多種多様さ!
• GC ログの場合
– 全て別々の設定
ログローテートは GC ログにだけある
Copyright©2017 NTT corp. All Rights Reserved.+ 13!
-Xloggc:/path/to/gc_...
問題点!
• 出力内容に一貫性がない
– コンポーネントごとにまちまち
• 設定が多種多様過ぎる
– 実行後は変更ができない
• レベルやカテゴリ管理がない
– デバッグレベルはあるが別バイナリ
デバッグ用バイナリは自分でビルドが必要
Copy...
カテゴリ管理がないと…!
– 正確な理解には実装の確認が必要
– 複数種別のログが混ざると経験に
基づいて読み解く必要がある
デバッグログはパーサーを書くのも大変
Copyright©2017 NTT corp. All Rights Rese...
問題点!
• 出力内容に一貫性がない
– コンポーネントごとにまちまち
• 設定が多種多様過ぎる
– 実行後は変更ができない
• レベルやカテゴリ管理がない
– デバッグレベルはあるが別バイナリ
アドホックに追加するのはもうやめよう
Copyr...
Unified JVM Logging!
• フレームワークを導入して一貫
性を保つ (JEP 158)
– カテゴリ分け、ログレベルを導入
– 統一された実装・設定・出力
• 特に GC ログ周りを大幅に手入
れ (JEP 271)
JEP ...
Quiz #1!
• Java 8 以前のログ出力に関係す
るフラグは -XX:+TraceXXX (17
種類) -XX:+PrintXXX(49種類)以
外にもある。マルかバツか。
マルバツクイズ
Copyright©2017 NTT co...
Quiz #1!
• Java 8 以前のログ出力に関係す
るフラグは -XX:+TraceXXX (17
種類) -XX:+PrintXXX(49種類)以
外にもある。マルかバツか。
• マル。例えば ParallelGCVerbose,
P...
Next!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行
• お役立ち(?)情報
統一された設定とやらを見せてもらおうか!
Copyright©2017 NTT corp. ...
設定方法!
• シンプルな設定
– 全て -Xlog で設定する
「ログはこれ」と言えるのは大きい
Copyright©2017 NTT corp. All Rights Reserved.+ 21!
-Xlog	
 [:[what]	
 [:...
基本的な設定方法!
• -Xlog 全てのinfoログを標準出力
• -Xlog:help ヘルプメッセージ
• -Xlog:disable ログ無効化+
デフォルトは全 warning ログが標準出力される
Copyright©2017 NT...
ログ例!
全 info ログを有効にしてバージョン表示
Copyright©2017 NTT corp. All Rights Reserved.+ 23!
%	java	-Xlog	-version	
[0.003s][info][os]	S...
ログ例!
デコレータ(decorator):各ログに付く汎用情報
Copyright©2017 NTT corp. All Rights Reserved.+ 24!
%	java	-Xlog	-version	
[0.003s][info][...
ログ例!
タグ(tags):各ログは必ず1~5個のタグに属する
Copyright©2017 NTT corp. All Rights Reserved.+ 25!
%	java	-Xlog	-version	
[0.003s][info][o...
Quiz #2!
•  java	-Xlog:disable	-version を実行
した場合、バージョン表示は出る?
デフォルト(-Xlogの設定無し)は warning が有効
Copyright©2017 NTT corp. All R...
Quiz #2!
•  java	-Xlog:disable	-version を実行
した場合、バージョン表示は出る?
•  出ます。バージョン関係はJVMログ
とは別扱いのエラーメッセージです+
•  ログではなく java コマンドの応答...
Next!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行
• お役立ち(?)情報
設定方法のポリシーを学びましょう
Copyright©2017 NTT corp. All ...
Syntax!
– what:出力内容をタグとレベルで選択+
– output:出力先の指定+
– decorators:デコレータの指定+
– output-options:ログローテート設定
全て省略できる(未指定時用の値が設定される)
C...
decorator!
• 各ログに追記される汎用情報+
– 未指定の場合: uptime, level, tags
• 起動時間(秒)、ログレベル、タグ
出力順は固定
Copyright©2017 NTT corp. All Rights Re...
decorator!
• 各ログに追記される汎用情報+
– 未指定の場合: uptime, level, tags
• 起動時間(秒)、ログレベル、タグ
出力順は固定
Copyright©2017 NTT corp. All Rights Re...
decorator!
• 全部乗せ
– 「,」で区切れば複数指定できる+
指定の順番を変えても出力の順番はこの通り
Copyright©2017 NTT corp. All Rights Reserved.+ 32!
%	java	-Xlog:...
decorator!
• 全部乗せ
– 「,」で区切れば複数指定できる+
pid はファイル名に付ければほぼ困らない
Copyright©2017 NTT corp. All Rights Reserved.+ 33!
%	java	-Xlog...
decorator!
• お勧めの最低設定
– (utc)time,level,tags
– 短命なプロセスや詳細解析の場合は
uptime(millis|nanos)もあると便利
ローカル時刻か UTC かはお好み
Copyright©201...
output, output-option!
•  output: 出力先 (未指定時:stdout)
– stdout / stderr / file=<filename>
• %p: pid, %t: 開始時刻 (filenameで利用)
...
what!
• 出力内容をタグとレベルで指定
– Tag=Level
• -Xlog:all=info	
• -Xlog:gc*=debug	
• Level (未指定の場合:info)
trace は hotspot 内部実装を追ってる人向け...
what!
• Tag (未指定の場合:all)
悪夢再び?
Copyright©2017 NTT corp. All Rights Reserved.+ 37!
add,	age,	alloc,	aot,	annotation,	argume...
Tags!
•  大分類から小分類まで混在して
おり、全部を覚える必要はない+
•  重要なタグの例+
– GC 関連:gc
– エラー関連:exceptions
– スレッド関連:os, thread
– 動作解析関連:class, vmop...
タグの設定方法!
タグは * + , を利用して柔軟に指定できる
Copyright©2017 NTT corp. All Rights Reserved.+ 39!
-Xlog[:[what][:[output][:[decorators][...
タグの設定方法!
Copyright©2017 NTT corp. All Rights Reserved.+ 40!
-Xlog[:[what][:[output][:[decorators][:output-options]]]]	
•  ...
タグの設定方法!
T1関係全て。gc* 等、その機能全体の監視時に
Copyright©2017 NTT corp. All Rights Reserved.+ 41!
-Xlog[:[what][:[output][:[decorators]...
タグの設定方法!
この組合せのみ。別出力とか制限付けたい時に
Copyright©2017 NTT corp. All Rights Reserved.+ 42!
-Xlog[:[what][:[output][:[decorators][:o...
タグの設定方法!
T1とT2が含まれる全てのログ。
Copyright©2017 NTT corp. All Rights Reserved.+ 43!
-Xlog[:[what][:[output][:[decorators][:output...
タグの設定方法!
T1+T2* ≒ (T1+T2)*
Copyright©2017 NTT corp. All Rights Reserved.+ 44!
-Xlog[:[what][:[output][:[decorators][:outpu...
タグの設定方法!
T1とT2に関連するもの全部。大分類二つとか
Copyright©2017 NTT corp. All Rights Reserved.+ 45!
-Xlog[:[what][:[output][:[decorators][:...
T1+
タグの設定方法!
T1関連は出しつつ、T2関連は秘密にする
Copyright©2017 NTT corp. All Rights Reserved.+ 46!
-Xlog[:[what][:[output][:[decorators]...
タグの設定方法!
これはどうなるか?
Copyright©2017 NTT corp. All Rights Reserved.+ 47!
-Xlog[:[what][:[output][:[decorators][:output-option...
タグの設定方法!
T1 関連ログを全てdebugログ出力
Copyright©2017 NTT corp. All Rights Reserved.+ 48!
-Xlog[:[what][:[output][:[decorators][:out...
T1+
タグの設定方法!
T1とT2の組合せに限ったログ
Copyright©2017 NTT corp. All Rights Reserved.+ 49!
-Xlog[:[what][:[output][:[decorators][:out...
T1+
タグの設定方法!
は、出力しない
Copyright©2017 NTT corp. All Rights Reserved.+ 50!
-Xlog[:[what][:[output][:[decorators][:output-opti...
T1+
タグの設定方法!
最終的に橙色部分が debug レベルで出力
Copyright©2017 NTT corp. All Rights Reserved.+ 51!
-Xlog[:[what][:[output][:[decorator...
具体的な使い道の例!
-Xlog:gc	
•  GC結果の概要だけ確認
-Xlog:class+load=debug,class+unload=debug	
•  クラスローディングとアンローディングの確認
-Xlog:gc*=debug,vm...
Quiz #3!
•  java	-Xlog:disable	–Xlog:gc* とした
場合はどうなるか?
最初のみ有効 or 最後のみ有効 or それ以外?
Copyright©2017 NTT corp. All Rights Reser...
Quiz #3!
•  java	-Xlog:disable	–Xlog:gc* とした
場合はどうなるか?
•  前から順番に全て評価する。全部無
効にした後に、GC関係のinfoログを
有効にするので –Xlog:gc* と同義+
•  順...
Next!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行
• お役立ち(?)情報
これまでの設定からこれからの設定へ
Copyright©2017 NTT corp. All...
Java 8からのGCログ移行!
•  Java 8
•  Java 9
以前より詳細になるが後でフィルタすれば良い
Copyright©2017 NTT corp. All Rights Reserved.+ 56!
-Xloggc:/pat...
Next!
• そもそもなぜ変わるのか
• 設定方法を把握する
– 概要
– ログの設定方法
– Java 8 設定からの移行+
• お役立ち(?)情報
今回の変更により便利になったところなど
Copyright©2017 NTT corp. ...
起動後もログ設定が可能!
• jcmd で起動後から変えられる
無効化は jcmd VM.log disable を実行
Copyright©2017 NTT corp. All Rights Reserved.+ 58!
$	jcmd	<pi...
強制ログローテート!
• jcmd で手動ローテートが可能
– ファイル出力かつfilecount=1以上
が条件
– filesize=0 にして cron 等で実行す
れば定期的なローテートが可能
filecount=0 だと実行しても同じ...
ログローテート!
•  -Xlog::test.log::filecount=n	
先ずは指定したファイルに出力
Copyright©2017 NTT corp. All Rights Reserved.+ 60!
test.log+
ログローテート!
•  -Xlog::test.log::filecount=n	
ローテート 1 回目
Copyright©2017 NTT corp. All Rights Reserved.+ 61!
test.log+
test.log...
ログローテート!
•  -Xlog::test.log::filecount=n	
ローテート 2 回目
Copyright©2017 NTT corp. All Rights Reserved.+ 62!
test.log+
test.log...
ログローテート!
•  -Xlog::test.log::filecount=n	
ローテート n 回目
Copyright©2017 NTT corp. All Rights Reserved.+ 63!
test.log+
test.log...
ログローテート!
•  -Xlog::test.log::filecount=n	
ローテート n+1 回目
Copyright©2017 NTT corp. All Rights Reserved.+ 64!
test.log+
test.l...
ログローテート!
•  -Xlog::test.log::filecount=n	
filecount は残したい世代分設定しましょう
Copyright©2017 NTT corp. All Rights Reserved.+ 65!
tes...
GCの要確認ログの移行状況!
•  Full GC 起因となるイベント
– Evacuation Failure (G1 GC)
– promotion failed (CMS GC)
– Concurrent mode failure (CM...
GCの要確認ログの移行状況!
•  Stop The World を伴う GC 処理
Pause が付く
Copyright©2017 NTT corp. All Rights Reserved.+ 67!
[info][gc]	GC(N)	P...
STW の確認方法!
-Xlog:gc*=debug,vmoperation=debug	
Copyright©2017 NTT corp. All Rights Reserved.+ 68!
[debug][vmoperation]	begi...
GC 以外の STW 確認方法!
•  VM_Operation で実行される
– タイムスタンプの差分(今回は0.02sec)
でSTW時間が解る
タイムスタンプの分解能以上は不可なので注意	
Copyright©2017 NTT corp....
ヒープ状況の確認!
•  ヒープ全体の使用量と容量
– 各 GC 方式で共通の表示
• Pause 処理終了時にヒープ全体量出力
領域ごとは出ないが概要は掴める	
Copyright©2017 NTT corp. All Rights Rese...
ヒープ状況の確認(G1)!
•  各領域のヒープ状況
– GC 方式ごとに異なる
G1	GC の各領域毎のメモリ状況	
Copyright©2017 NTT corp. All Rights Reserved.+ 71!
E+
O
S+
O
O...
ヒープ状況の確認(G1)!
•  各領域のヒープ状況(info)	
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用	
info	ログは単位がリージョン数で出力される	
Copyright©2017 NTT c...
ヒープ状況の確認(G1)!
•  各領域のヒープ状況(debug)+
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+
Humongous は?	
Copyright©2017 NTT corp. All R...
ヒープ状況の確認(G1)!
•  各領域のヒープ状況(debug)+
水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+
Live なものを心を籠めて全部足し算	
Copyright©2017 NTT corp...
ULViewer!
• 次世代 GC Viewer
– https://github.com/YaSuenag/ulviewer
タグでフィルタリング可、GC 以外も可視化
Copyright©2017 NTT corp. All Rights...
まとめ!
• Java 9 からログが統一される
設定や出力が一新されて管理が楽に
-Xlog:何を:どこに:装飾:ローテート
• どの様に設定していくべきか?
-Xlog:all=debug から始めてフィル
タリングしていくのがお勧め
まず...
Q!
Copyright©2017 NTT corp. All Rights Reserved.+ 77!
おつかれさまでした
Nächste SlideShare
Wird geladen in …5
×

Unified JVM Logging

8.050 Aufrufe

Veröffentlicht am

This slide introduces about Unified JVM Logging.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

Unified JVM Logging

  1. 1. Unified JVM Logging! KUBOTA Yuji @sugarlife+ NTT OSSセンタ+ Copyright©2017 NTT corp. All Rights Reserved.+ 2017/05+
  2. 2. はじめに! • 本セッションは Java 9 から変 わる JVM ログの設定方法を把 握することが第一目標です • Log4J を代表としたロギングの java.util.logging は扱いません ここは口頭補足用なので見えなくても OK Copyright©2017 NTT corp. All Rights Reserved.+ 2!
  3. 3. おやくそく! • 本セッション (スライド) は、 以下の JVM 実装に基づきます – OpenJDK 9 EA b170 (HotSpot VM) – jdk9/jdk9/hotspot 12762:b3ee8ab233ed EA = Early Access。正式リリース前のバイナリ Copyright©2017 NTT corp. All Rights Reserved.+ 3! $ java -version java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+170) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+170, mixed mode)+
  4. 4. 「楽してJVMを学びたい」シリーズを喋ってる人 Copyright©2017 NTT corp. All Rights Reserved.+ 4! KUBOTA Yuji (@sugarlife) Java Technical Support Engineer @NTT OSS センタ OpenJDK author, IcedTea committer Speaker (JavaOne, JJUG, etc…) Who I am!
  5. 5. Agenda! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 設定の仕方を覚えて帰りましょう Copyright©2017 NTT corp. All Rights Reserved.+ 5!
  6. 6. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 JDK 9 から変わる理由 Copyright©2017 NTT corp. All Rights Reserved.+ 6!
  7. 7. 歴史的経緯! • 元々は標準出力 • ファイルにも出力に対応 • タイムスタンプやより詳細な内 容を出力するように改修 • GCログ、JITコンパイルログな ど出力される内容(種類)も増加 バージョンを重ねるごとにアドホックに改善 Copyright©2017 NTT corp. All Rights Reserved.+ 7!
  8. 8. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち – メッセージも半固定で柔軟に実装 できない (OpenJDK 開発での問題) • 設定が多種多様過ぎる • レベルやカテゴリ制御がない アドホック過ぎて一貫性が失われた Copyright©2017 NTT corp. All Rights Reserved.+ 8!
  9. 9. 一貫性のない例! Copyright©2017 NTT corp. All Rights Reserved.+ 9! [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [CMS-concurrent-mark-start] [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs] [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] [Full GC62.696: [CMS64.460: [CMS-concurrent-sweep: 2.319/2.386 secs] [Times: user=3.75 sys=0.13, real=2.39 secs] (concurrent mode failure): 3315076K- JDK7uのログ+ マイナーアップデートで変わるのが一番辛い
  10. 10. 一貫性のない例! マイナーアップデートで変わるのが一番辛い Copyright©2017 NTT corp. All Rights Reserved.+ 10! [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [CMS-concurrent-mark-start] [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs] [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] [Full GC62.696: [CMS64.460: [CMS-concurrent-sweep: 2.319/2.386 secs] [Times: user=3.75 sys=0.13, real=2.39 secs] (concurrent mode failure): 3315076K- 唐突かつ特に 意味はない+ CMS-initial-mark-startは?+ 出ないケースがある(上のログもFull GC)+ フェーズごとに異なる値(size)+ JDK7uのログ+ フェーズごとに異なる値(time)+
  11. 11. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ制御がない 多種多様性が便利なのはその通り Copyright©2017 NTT corp. All Rights Reserved.+ 11!
  12. 12. PrintXX, TraceXX だけでも 66 種類ある(8u131) Copyright©2017 NTT corp. All Rights Reserved.+ 12! PrintAdaptiveSizePolicy+ PrintCMSInitiationStatistics+ PrintCMSStatistics+ PrintClassHistogram+ PrintClassHistogramAfterFullGC+ PrintClassHistogramBeforeFullGC+ PrintCodeCache+ PrintCodeCacheOnCompilation+ PrintCommandLineFlags+ PrintCompilation+ PrintConcurrentLocks+ PrintFLSCensus+ PrintFLSStatistics+ PrintGC+ PrintGCApplicationConcurrentTime+ PrintGCApplicationStoppedTime+ PrintGCCause+ PrintGCDateStamps+ PrintGCDetails+ PrintGCID+ PrintGCTaskTimeStamps+ PrintGCTimeStamps+ PrintHeapAtGC+ PrintHeapAtGCExtended+ PrintHeapAtSIGBREAK+ PrintJNIGCStalls+ PrintJNIResolving+ PrintOldPLAB+ PrintOopAddress+ PrintPLAB PrintPromotionFailure+ PrintReferenceGC+ PrintSafepointStatistics+ PrintSharedArchiveAndExit PrintSharedDictionary+ PrintSharedSpaces PrintTLAB+ PrintTenuringDistribution+ PrintTieredEvents+ PrintVMOptions+ PrintVMQWaitTime+ PrintWarnings+ TraceBiasedLocking+ TraceClassLoading+ TraceClassLoadingPreorder+ TraceClassPaths+ TraceClassResolution+ TraceClassUnloading TraceDynamicGCThreads+ TraceJVMTI+ PrintParallelOldGCPhaseTimes PrintStringDeduplicationStatistics+ PrintStringTableStatistics PrintSafepointStatisticsCount+ PrintSafepointStatisticsTimeout+ TraceGen0Time+ TraceGen1Time+ TraceLoaderConstraints+ TraceMetadataHumongousAllocation+ TraceMonitorInflation+ TraceParallelOldGCTasks+ TraceRedefineClasses+ TraceSafepointCleanupTime+ TraceSuspendWaitFailures+ 設定の多種多様さ(一部例)! ○:後から変えられない ので事前に把握が必要+ △:細やかな設定が可能+ ◎:無理ゲー+
  13. 13. 設定の多種多様さ! • GC ログの場合 – 全て別々の設定 ログローテートは GC ログにだけある Copyright©2017 NTT corp. All Rights Reserved.+ 13! -Xloggc:/path/to/gc_%p_%t.log #出力先 -XX:+PrintGCDetails #詳細出力 -XX:+PrintGCDateStamps #タイムスタンプ -XX:+UseGCLogFileRotation #ログローテート -XX:GCLogFileSize=100m #(〃)サイズ数 -XX:NumberOfGCLogFiles=7 #(〃)世代数 JDK8u131の設定+
  14. 14. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ管理がない – デバッグレベルはあるが別バイナリ デバッグ用バイナリは自分でビルドが必要 Copyright©2017 NTT corp. All Rights Reserved.+ 14!
  15. 15. カテゴリ管理がないと…! – 正確な理解には実装の確認が必要 – 複数種別のログが混ざると経験に 基づいて読み解く必要がある デバッグログはパーサーを書くのも大変 Copyright©2017 NTT corp. All Rights Reserved.+ 15! [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] JDK7uのログ+ それぞれ何の値か判断可能か?+
  16. 16. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ管理がない – デバッグレベルはあるが別バイナリ アドホックに追加するのはもうやめよう Copyright©2017 NTT corp. All Rights Reserved.+ 16!
  17. 17. Unified JVM Logging! • フレームワークを導入して一貫 性を保つ (JEP 158) – カテゴリ分け、ログレベルを導入 – 統一された実装・設定・出力 • 特に GC ログ周りを大幅に手入 れ (JEP 271) JEP 271 は Unified GC Logging Copyright©2017 NTT corp. All Rights Reserved.+ 17!
  18. 18. Quiz #1! • Java 8 以前のログ出力に関係す るフラグは -XX:+TraceXXX (17 種類) -XX:+PrintXXX(49種類)以 外にもある。マルかバツか。 マルバツクイズ Copyright©2017 NTT corp. All Rights Reserved.+ 18!
  19. 19. Quiz #1! • Java 8 以前のログ出力に関係す るフラグは -XX:+TraceXXX (17 種類) -XX:+PrintXXX(49種類)以 外にもある。マルかバツか。 • マル。例えば ParallelGCVerbose, ProfilerPrintByteCodeStatistics など マルバツクイズ Copyright©2017 NTT corp. All Rights Reserved.+ 19! ドキュメントもほぼない
  20. 20. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 統一された設定とやらを見せてもらおうか! Copyright©2017 NTT corp. All Rights Reserved.+ 20!
  21. 21. 設定方法! • シンプルな設定 – 全て -Xlog で設定する 「ログはこれ」と言えるのは大きい Copyright©2017 NTT corp. All Rights Reserved.+ 21! -Xlog  [:[what]  [:[output]  [:[decorators]  [:output-options]]]]
  22. 22. 基本的な設定方法! • -Xlog 全てのinfoログを標準出力 • -Xlog:help ヘルプメッセージ • -Xlog:disable ログ無効化+ デフォルトは全 warning ログが標準出力される Copyright©2017 NTT corp. All Rights Reserved.+ 22! -Xlogを設定してない場合+
  23. 23. ログ例! 全 info ログを有効にしてバージョン表示 Copyright©2017 NTT corp. All Rights Reserved.+ 23! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). ログ内容+
  24. 24. ログ例! デコレータ(decorator):各ログに付く汎用情報 Copyright©2017 NTT corp. All Rights Reserved.+ 24! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). 起動経過時間、 ログレベル、タグ (デフォルト)+ ログ内容+
  25. 25. ログ例! タグ(tags):各ログは必ず1~5個のタグに属する Copyright©2017 NTT corp. All Rights Reserved.+ 25! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). 起動経過時間、 ログレベル、タグ (デフォルト)+ タグ≒ログのカテゴリ+ ログ内容+カテゴリに沿ったログ内容+
  26. 26. Quiz #2! •  java -Xlog:disable -version を実行 した場合、バージョン表示は出る? デフォルト(-Xlogの設定無し)は warning が有効 Copyright©2017 NTT corp. All Rights Reserved.+ 26! ログ無効+
  27. 27. Quiz #2! •  java -Xlog:disable -version を実行 した場合、バージョン表示は出る? •  出ます。バージョン関係はJVMログ とは別扱いのエラーメッセージです+ •  ログではなく java コマンドの応答だ と考えると解りやすい 前スライドで decorator が出てないのが解る Copyright©2017 NTT corp. All Rights Reserved.+ 27! ログ無効+
  28. 28. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 設定方法のポリシーを学びましょう Copyright©2017 NTT corp. All Rights Reserved.+ 28!
  29. 29. Syntax! – what:出力内容をタグとレベルで選択+ – output:出力先の指定+ – decorators:デコレータの指定+ – output-options:ログローテート設定 全て省略できる(未指定時用の値が設定される) Copyright©2017 NTT corp. All Rights Reserved.+ 29! -Xlog[:[what][:[output][:[decorators][:output-options]]]] -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  30. 30. decorator! • 各ログに追記される汎用情報+ – 未指定の場合: uptime, level, tags • 起動時間(秒)、ログレベル、タグ 出力順は固定 Copyright©2017 NTT corp. All Rights Reserved.+ 30! none, time (t), utctime (utc), timemillis (tm), timenanos (tn), uptime (u), uptimemillis (um), uptimenanos (un), hostname (hn), pid (p), tid (ti), level (l), tags (tg) -Xlog[:[what][:[output][:[decorators][:output-options]]]] 何もなし+
  31. 31. decorator! • 各ログに追記される汎用情報+ – 未指定の場合: uptime, level, tags • 起動時間(秒)、ログレベル、タグ 出力順は固定 Copyright©2017 NTT corp. All Rights Reserved.+ 31! none, time (t), utctime (utc), timemillis (tm), timenanos (tn), uptime (u), uptimemillis (um), uptimenanos (un), hostname (hn), pid (p), tid (ti), level (l), tags (tg) -Xlog[:[what][:[output][:[decorators][:output-options]]]] 時刻+ 起動時間+ 何もなし+
  32. 32. decorator! • 全部乗せ – 「,」で区切れば複数指定できる+ 指定の順番を変えても出力の順番はこの通り Copyright©2017 NTT corp. All Rights Reserved.+ 32! % java -Xlog:::t,utc,u,tm,um,tn,un,hn,p,ti,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [14.101s] [1494599892016ms][14102ms] [963128253785077ns][14101433214ns] [localhost.localdomain][73398][115144] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] ※本来は一行表示+
  33. 33. decorator! • 全部乗せ – 「,」で区切れば複数指定できる+ pid はファイル名に付ければほぼ困らない Copyright©2017 NTT corp. All Rights Reserved.+ 33! % java -Xlog:::t,utc,u,tm,um,tn,un,hn,p,ti,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [14.101s] [1494599892016ms][14102ms] [963128253785077ns][14101433214ns] [localhost.localdomain][73398][115144] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] process id と thread id は見分けにくい+ ※本来は一行表示+
  34. 34. decorator! • お勧めの最低設定 – (utc)time,level,tags – 短命なプロセスや詳細解析の場合は uptime(millis|nanos)もあると便利 ローカル時刻か UTC かはお好み Copyright©2017 NTT corp. All Rights Reserved.+ 34! % java -Xlog:::t,utc,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] ※本来は一行表示+
  35. 35. output, output-option! •  output: 出力先 (未指定時:stdout) – stdout / stderr / file=<filename> • %p: pid, %t: 開始時刻 (filenameで利用) •  output-option: ログローテート設定 – 「,」で区切って以下の二つを指定する – filecount=n: 世代数 (未指定時:5) – filesize=n: ファイルサイズ (未指定時:20M) ローテート設定は指定して増やした方が無難 Copyright©2017 NTT corp. All Rights Reserved.+ 35! -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  36. 36. what! • 出力内容をタグとレベルで指定 – Tag=Level • -Xlog:all=info • -Xlog:gc*=debug • Level (未指定の場合:info) trace は hotspot 内部実装を追ってる人向け Copyright©2017 NTT corp. All Rights Reserved.+ 36! off, trace, debug, info, warning, error -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  37. 37. what! • Tag (未指定の場合:all) 悪夢再び? Copyright©2017 NTT corp. All Rights Reserved.+ 37! add, age, alloc, aot, annotation, arguments, attach, barrier, biasedlocking, blocks, bot, breakpoint, census, class, classhisto, cleanup, compaction, constraints, constantpool, coops, cpu, cset, data, defaultmethods, dump, ergo, exceptions, exit, fingerprint, freelist, gc, hashtables, heap, humongous, ihop, iklass, init, itables, jni, jvmti, liveness, load, loader, logging, mark, marking, methodcomparator, metadata, metaspace, mmu, modules, monitorinflation, monitormismatch, nmethod, normalize, objecttagging, obsolete, oopmap, os, pagesize, patch, path, phases, plab, promotion, preorder, protectiondomain, ref, redefine, refine, region, remset, purge, resolve, safepoint, scavenge, scrub, stacktrace, stackwalk, start, startuptime, state, stats, stringdedup, stringtable, stackmap, subclass, survivor, sweep, task, thread, tlab, time, timer, update, unload, verification, verify, vmoperation, vtables, workgang, jfr, system, parser, bytecode, setting, event -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  38. 38. Tags! •  大分類から小分類まで混在して おり、全部を覚える必要はない+ •  重要なタグの例+ – GC 関連:gc – エラー関連:exceptions – スレッド関連:os, thread – 動作解析関連:class, vmoperation 実質二つのログしかないタグもある Copyright©2017 NTT corp. All Rights Reserved.+ 38! -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  39. 39. タグの設定方法! タグは * + , を利用して柔軟に指定できる Copyright©2017 NTT corp. All Rights Reserved.+ 39! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+ all で 全部+
  40. 40. タグの設定方法! Copyright©2017 NTT corp. All Rights Reserved.+ 40! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ T1だけ。1タグのログは主にサマリ確認用 T2+ TX+
  41. 41. タグの設定方法! T1関係全て。gc* 等、その機能全体の監視時に Copyright©2017 NTT corp. All Rights Reserved.+ 41! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ TX+ T2+
  42. 42. タグの設定方法! この組合せのみ。別出力とか制限付けたい時に Copyright©2017 NTT corp. All Rights Reserved.+ 42! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+
  43. 43. タグの設定方法! T1とT2が含まれる全てのログ。 Copyright©2017 NTT corp. All Rights Reserved.+ 43! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+
  44. 44. タグの設定方法! T1+T2* ≒ (T1+T2)* Copyright©2017 NTT corp. All Rights Reserved.+ 44! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+ これは NG+
  45. 45. タグの設定方法! T1とT2に関連するもの全部。大分類二つとか Copyright©2017 NTT corp. All Rights Reserved.+ 45! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ T2+ TX+ これは NG+
  46. 46. T1+ タグの設定方法! T1関連は出しつつ、T2関連は秘密にする Copyright©2017 NTT corp. All Rights Reserved.+ 46! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T2+ これは NG+
  47. 47. タグの設定方法! これはどうなるか? Copyright©2017 NTT corp. All Rights Reserved.+ 47! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T2+T1+ TX+
  48. 48. タグの設定方法! T1 関連ログを全てdebugログ出力 Copyright©2017 NTT corp. All Rights Reserved.+ 48! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T2+
  49. 49. T1+ タグの設定方法! T1とT2の組合せに限ったログ Copyright©2017 NTT corp. All Rights Reserved.+ 49! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T1+ T2+
  50. 50. T1+ タグの設定方法! は、出力しない Copyright©2017 NTT corp. All Rights Reserved.+ 50! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T1+ T2+
  51. 51. T1+ タグの設定方法! 最終的に橙色部分が debug レベルで出力 Copyright©2017 NTT corp. All Rights Reserved.+ 51! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off T1+T1+ TX+ T1+ [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T2+
  52. 52. 具体的な使い道の例! -Xlog:gc •  GC結果の概要だけ確認 -Xlog:class+load=debug,class+unload=debug •  クラスローディングとアンローディングの確認 -Xlog:gc*=debug,vmoperation=debug •  GC挙動全体の詳細とSTWに関わる処理の確認 -Xlog:gc*=debug,gc+humongous=off •  詳細確認したいがhumongousリージョン関連GCの場合、 本リージョンのメモリマップ情報が大量に出力されるの でオフにする (,で付け足して他もオフにできる) Copyright©2017 NTT corp. All Rights Reserved.+ 52! -Xlog[:[what][:[output][:[decorators][:output-options]]]] フラグを調べるより直感的 TraceClassLoaderDataは class+loader+data=debug+
  53. 53. Quiz #3! •  java -Xlog:disable –Xlog:gc* とした 場合はどうなるか? 最初のみ有効 or 最後のみ有効 or それ以外? Copyright©2017 NTT corp. All Rights Reserved.+ 53!
  54. 54. Quiz #3! •  java -Xlog:disable –Xlog:gc* とした 場合はどうなるか? •  前から順番に全て評価する。全部無 効にした後に、GC関係のinfoログを 有効にするので –Xlog:gc* と同義+ •  順番に評価されるので、最後の設定 のみ有効になるわけではない 別々のファイルに出力したい時などで使えます Copyright©2017 NTT corp. All Rights Reserved.+ 54!
  55. 55. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 これまでの設定からこれからの設定へ Copyright©2017 NTT corp. All Rights Reserved.+ 55!
  56. 56. Java 8からのGCログ移行! •  Java 8 •  Java 9 以前より詳細になるが後でフィルタすれば良い Copyright©2017 NTT corp. All Rights Reserved.+ 56! -Xloggc:/path/to/gc_%p_%t.log #出力先 -XX:+PrintGCDetails #詳細出力 -XX:+PrintGCDateStamps #タイムスタンプ -XX:+UseGCLogFileRotation #ログローテート -XX:GCLogFileSize=100m #(〃)サイズ数 -XX:NumberOfGCLogFiles=7 #(〃)世代数 -Xlog:gc*=debug:/path/to/gc_%p_%t.log:time, level,tags:filesize=100m, filecount=7 ※ログサイズ等は適当です(普通は足りない)+
  57. 57. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行+ • お役立ち(?)情報 今回の変更により便利になったところなど Copyright©2017 NTT corp. All Rights Reserved.+ 57!
  58. 58. 起動後もログ設定が可能! • jcmd で起動後から変えられる 無効化は jcmd VM.log disable を実行 Copyright©2017 NTT corp. All Rights Reserved.+ 58! $ jcmd <pid> VM.log output="file=/path/to/gc_%p_%t.log" output_options="filecount=7,filesize=200m" what="gc*=debug" decorators="time,level,tags" <pid>: Command executed successfully $ jcmd <pid> VM.log list <pid>: : Log output configuration: #0: stdout all=warning uptime,level,tags #1: stderr all=off uptime,level,tags #2: file=/path/to/gc_%p_%t.log gc*=debug time,level,tags+ -Xlog の設定 方法と一緒+ output=#2 を指定 すると上書き可能+
  59. 59. 強制ログローテート! • jcmd で手動ローテートが可能 – ファイル出力かつfilecount=1以上 が条件 – filesize=0 にして cron 等で実行す れば定期的なローテートが可能 filecount=0 だと実行しても同じファイルに追記 Copyright©2017 NTT corp. All Rights Reserved.+ 59! $ jcmd <pid> VM.log rotate <pid>: Command executed successfully
  60. 60. ログローテート! •  -Xlog::test.log::filecount=n 先ずは指定したファイルに出力 Copyright©2017 NTT corp. All Rights Reserved.+ 60! test.log+
  61. 61. ログローテート! •  -Xlog::test.log::filecount=n ローテート 1 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 61! test.log+ test.log.0+ ←移動したら空ファイル+
  62. 62. ログローテート! •  -Xlog::test.log::filecount=n ローテート 2 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 62! test.log+ test.log.0+ test.log.1+
  63. 63. ログローテート! •  -Xlog::test.log::filecount=n ローテート n 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 63! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+
  64. 64. ログローテート! •  -Xlog::test.log::filecount=n ローテート n+1 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 64! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+test.log.0 上書き+
  65. 65. ログローテート! •  -Xlog::test.log::filecount=n filecount は残したい世代分設定しましょう Copyright©2017 NTT corp. All Rights Reserved.+ 65! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+test.log.0 上書き+ test.log.1 上書き+ test.log.(n-1) 上書き+
  66. 66. GCの要確認ログの移行状況! •  Full GC 起因となるイベント – Evacuation Failure (G1 GC) – promotion failed (CMS GC) – Concurrent mode failure (CMS GC) CMS GC は JDK 9 から非推奨化 Copyright©2017 NTT corp. All Rights Reserved.+ 66! [info][gc] GC(N) To-space exhausted [info][gc, promotion] GC(N) Promotion failed [debug][gc] GC(N) Concurrent mode failure ナンバリング(発生回数)+
  67. 67. GCの要確認ログの移行状況! •  Stop The World を伴う GC 処理 Pause が付く Copyright©2017 NTT corp. All Rights Reserved.+ 67! [info][gc] GC(N) Pause <種別> (<GC Cause>) [info][gc] GC(1) Pause Young (Allocation Failure) [info][gc] GC(2) Pause Full (Allocation Failure) # G1 GC [info][gc] GC(3) Pause Initial Mark (G1 Evacuation Pause) [info][gc] GC(3) Pause Remark [info][gc] GC(3) Pause Cleanup # CMS GC [info][gc] GC(4) Pause Initial Mark [info][gc] GC(4) Pause Remark
  68. 68. STW の確認方法! -Xlog:gc*=debug,vmoperation=debug Copyright©2017 NTT corp. All Rights Reserved.+ 68! [debug][vmoperation] begin VM_Operation (0x0000700001c2e1c8): G1IncCollectionPause, mode: safepoint, requested by thread 0x00007fb6818df800 [info ][gc,start ] GC(6) Pause Initial Mark (G1 Evacuation Pause) :(Initial Mark の処理) [info ][gc ] GC(6) Pause Initial Mark (G1 Evacuation Pause) 114M->82M(256M) 2.598ms [info ][gc,cpu ] GC(6) User=0.00s Sys=0.00s Real=0.01s [debug][vmoperation] end VM_Operation (0x0000700001c2e1c8): G1IncCollectionPause, mode: safepoint, requested by thread 0x00007fb6818df800 G1 GC の Initial Mark フェーズの例 (抜粋)+ STW 時間+ CPU 時間+
  69. 69. GC 以外の STW 確認方法! •  VM_Operation で実行される – タイムスタンプの差分(今回は0.02sec) でSTW時間が解る タイムスタンプの分解能以上は不可なので注意 Copyright©2017 NTT corp. All Rights Reserved.+ 69! [2017-05-17T23:38:35.277-0900][debug][vmoperation] begin VM_Operation (0x0000700001c2e1c8): Deoptmize, mode: safepoint, requested by thread 0x00007fb6818df800 :STW を伴う処理 [2017-05-12T23:38:35.279-0900][debug][vmoperation] end VM_Operation (0x0000700001c2e1c8): Deoptmize, mode: safepoint, requested by thread 0x00007fb6818df800 対応している+
  70. 70. ヒープ状況の確認! •  ヒープ全体の使用量と容量 – 各 GC 方式で共通の表示 • Pause 処理終了時にヒープ全体量出力 領域ごとは出ないが概要は掴める Copyright©2017 NTT corp. All Rights Reserved.+ 70! [info ][gc] GC(6) Pause Initial Mark (G1 Evacuation Pause) 114M->82M(256M) 2.598ms 処理前の 使用量+ 処理後の 使用量+ 容量+
  71. 71. ヒープ状況の確認(G1)! •  各領域のヒープ状況 – GC 方式ごとに異なる G1 GC の各領域毎のメモリ状況 Copyright©2017 NTT corp. All Rights Reserved.+ 71! E+ O S+ O O S+ S+ E+ H O E+ O O E+ S+ O O O O H+ O E+ E+ O 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+
  72. 72. ヒープ状況の確認(G1)! •  各領域のヒープ状況(info) 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用 info ログは単位がリージョン数で出力される Copyright©2017 NTT corp. All Rights Reserved.+ 72! [info][gc,heap ] Heap region size: 1M ------------------------------------------------------------------------------------------------------------------ :GC処理 [info][gc,heap ] GC(8) Eden regions: 1->0(68) [info][gc,heap ] GC(8) Survivor regions: 3->4(9) [info][gc,heap ] GC(8) Old regions: 8->8 [info][gc,heap ] GC(8) Humongous regions: 106->94 [info][gc,metaspace] GC(8) Metaspace: 6823K->6823K(1056768K) :debug ログ [info][gc ] GC(8) Pause Initial Mark (G1 Evacuation Pause) 116M->105M(308M) 3.401ms リージョンサ イズが異なる+ 掛算してサイズ計算+ Humongousはここから引き算して概算+
  73. 73. ヒープ状況の確認(G1)! •  各領域のヒープ状況(debug)+ 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+ Humongous は? Copyright©2017 NTT corp. All Rights Reserved.+ 73! [debug][gc,heap ] GC(8) Heap after GC invocations=13 (full 0): [debug][gc,heap ] GC(8) garbage-first heap total 315392K, used 107536K [0x00000006c0000000, 0x00000006c01009a0, 0x00000007c0000000) [debug][gc,heap ] GC(8) region size 1024K, 4 young (4096K), 4 survivors (4096K) [debug][gc,heap ] GC(8) Metaspace used 6823K, capacity 6906K, committed 7040K, reserved 1056768K [debug][gc,heap ] GC(8) class space used 612K, capacity 637K, committed 640K, reserved 1048576K リージョン数+ Eden+Survivor+ サイズ+
  74. 74. ヒープ状況の確認(G1)! •  各領域のヒープ状況(debug)+ 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+ Live なものを心を籠めて全部足し算 Copyright©2017 NTT corp. All Rights Reserved.+ 74! [debug][gc,humongous] GC(8) Live humongous region 0 object size 1228816 start 0x00000006c0000000 with remset 1 code roots 0 is marked 0 reclaim candidate 1 type array 1 : [debug][gc,humongous] GC(8) Live humongous region 106 object size 1884176 start 0x00000006c6a00000 with remset 0 code roots 0 is marked 0 reclaim candidate 0 type array 1 [debug][gc,humongous] GC(8) Live humongous region 112 object size 860176 start 0x00000006c7000000 with remset 1 code roots 0 is marked 0 reclaim candidate 1 type array 1
  75. 75. ULViewer! • 次世代 GC Viewer – https://github.com/YaSuenag/ulviewer タグでフィルタリング可、GC 以外も可視化 Copyright©2017 NTT corp. All Rights Reserved.+ 75!
  76. 76. まとめ! • Java 9 からログが統一される 設定や出力が一新されて管理が楽に -Xlog:何を:どこに:装飾:ローテート • どの様に設定していくべきか? -Xlog:all=debug から始めてフィル タリングしていくのがお勧め まずはログを読むのを楽しみましょう! Copyright©2017 NTT corp. All Rights Reserved.+ 76!
  77. 77. Q! Copyright©2017 NTT corp. All Rights Reserved.+ 77! おつかれさまでした

×