© 2021 NTT DATA Corporation
JAVA_HOME/binにあるコマンド、いくつ使っていますか?
[JVM関連ツール編]
2021年10月7日 JJUGナイトセミナー
株式会社NTTデータ
阪田 浩一
2
© 2021 NTT DATA Corporation
自己紹介
 株式会社NTTデータ 所属
 OpenJDK関連の研究開発
 Javaでのサポート、トラブルシュート、障害解析
 Javaチャンピオン
 OpenJDK Author (開発者権限が少しある)
 とにかくJVMに(詳しく)なりたい
阪田 浩一
jyukutyo
3
© 2021 NTT DATA Corporation
このセッションの対象と想定している方
 Javaアプリケーションの開発運用をしている方
 トラブルシュート経験がある方には
"復習"となります
入門的な内容です!
© 2020 NTT DATA Corporation
JAVA_HOME/binにある
コマンド
5
© 2021 NTT DATA Corporation
JAVA_HOME/binディレクトリ
 Java 8 : 43個
 Java 17: 28個
6
© 2021 NTT DATA Corporation
https://docs.oracle.com/en/java/javase/17/docs/specs/man/index.html
28個ある
7
© 2021 NTT DATA Corporation
このセッションでの"解析ツール"の範囲
 問題(障害、不具合など)を解決する
 データ取得、収集ツール
 収集したデータの解析(可視化)ツール
8
© 2021 NTT DATA Corporation
このセッションでの"解析ツール"の範囲
 問題(障害、不具合など)を解決する
 データ取得、収集ツール
• 収集に関する設定の追加変更を含む
 収集したデータの解析(可視化)ツール
© 2020 NTT DATA Corporation
その要求 このコマンドで
満たせます
10
© 2021 NTT DATA Corporation
要求 No.1
 障害発生!今後再発したらすぐスレッドダンプを
取っておいて!
 jcmdコマンドでスレッドダンプを取ろう
 jstackコマンドは使わない
https://docs.oracle.com/en/java/javase/17/troubleshoot/diagnostic-tools.html#GUID-36CBAF37-0B61-4455-9183-1268E6D497DD
11
© 2021 NTT DATA Corporation
要求 No.2
 フライトレコードを取りたい!
アプリケーションは再起動させずにね!
 jcmdコマンドでレコーディングを開始しよう
12
© 2021 NTT DATA Corporation
要求 No.3
 Unified Loggingのログ出力を設定したい!
アプリケーションは再起動させずにね!
 jcmdコマンドでULログ出力を設定しよう
13
© 2021 NTT DATA Corporation
結論
 jcmdがあれば何でもできる!
 注: ↑は誇張表現です
 対象はローカルプロセスのみ
 jcmd <pid|main_class> command ...
• pidはプロセスIDのこと
• 以降pidの方を使います
14
© 2021 NTT DATA Corporation
前述の要求を実現するjcmdのコマンド
 要求 No.1: スレッドダンプ取得
 jcmd <pid> Thread.print
 要求 No.2: フライトレコード開始
 jcmd <pid> JFR.start duration=1m filename=app.jfr
 要求 No.3: ログ設定追加
 jcmd <pid> VM.log output="sample.log"
output_options="filecount=3"
15
© 2021 NTT DATA Corporation
jcmdでのコマンドのドメイン
ドメイン 内容
VM JVMの実行情報取得 ログ設定など
Compiler JITコンパイラ関連
GC ガベージコレクション関連
Thread 現状スレッドダンプのみ
JVMTI JVM Tool Interface関連 エージェントのロードなど
JFR フライトレコード関連
ManagementAgent JMXエージェント関連
 jcmd <pid> command (ドメイン.操作という形式)
 コマンドとは別個の命令としてPerfcounter.printもある
16
© 2021 NTT DATA Corporation
pidを調べる
 pidとはプロセスIDのこと
 jcmdで調べられる!
 以前からあるjpsでもOK - 2つはオプションに差異あり
17
© 2021 NTT DATA Corporation
利用できるコマンドを確認するには
 jcmd <pid> help
© 2021 NTT DATA Corporation 18
各ドメインを概観します
19
© 2021 NTT DATA Corporation
Threadドメイン
 jcmd <pid> Thread.print のみ
20
© 2021 NTT DATA Corporation
各コマンドの詳細を確認するには
 jcmd <pid> help command
21
© 2021 NTT DATA Corporation
VMドメイン
 JVM関連の情報取得、設定変更
VM.classloader_stats VM.print_touched_methods
VM.class_hierarchy VM.set_flag
VM.command_line VM.stringtable
VM.dynlibs VM.symboltable
VM.info VM.systemdictionary
VM.log VM.system_properties
VM.flags VM.uptime
VM.native_memory VM.version
22
© 2021 NTT DATA Corporation
VMドメイン
 JVM関連の情報取得、設定変更
VM.classloader_stats VM.print_touched_methods
VM.class_hierarchy VM.set_flag
VM.command_line VM.stringtable
VM.dynlibs VM.symboltable
VM.info VM.systemdictionary
VM.log VM.system_properties
VM.flags VM.uptime
VM.native_memory VM.version
23
© 2021 NTT DATA Corporation
脱線: Java 16のjcmdにおけるULログ設定バグ
24
© 2021 NTT DATA Corporation
脱線: jcmdのバグ修正
https://bugs.openjdk.java.net/browse/JDK-8265047
25
© 2021 NTT DATA Corporation
26
© 2021 NTT DATA Corporation
脱線: Java 17のjcmdでのULログ
27
© 2021 NTT DATA Corporation
脱線: jcmdのバグ修正
 jcmd, jhsdb (後述) などのコマンド関連では
Java 17に対して3つほどコントリビュートできた
 コマンドは試しやすいのでバグを見つけられるかも!
 試すうちにJVMの知識もつき労力対効果がよい!
28
© 2021 NTT DATA Corporation
GCドメイン
 ガベージコレクションの情報取得
GC.class_histogram
GC.finalizer_info
GC.heap_dump
GC.heap_info
GC.run
GC.run_finalization
29
© 2021 NTT DATA Corporation
Compilerドメイン
 JITコンパイラの情報取得、取得設定
Compiler.codecache
Compiler.codelist
Compiler.queue
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
30
© 2021 NTT DATA Corporation
JVMTIドメイン
 JVM Tool Interface関連
JVMTI.agent_load
JVMTI.data_dump
31
© 2021 NTT DATA Corporation
ManagementAgentドメイン、JFRドメイン
 後で詳しく説明します
32
© 2021 NTT DATA Corporation
使わなくなったコマンドたち
 jcmdで同様のことができるコマンド
 jstack
 jinfo
• jcmd VMドメインにあるコマンドたちを使用
 jmap
• 例) ヒープダンプ: GC.heap_dump <filename>
• 例) ヒープヒストグラム: GC.class_histogram
33
© 2021 NTT DATA Corporation
jcmdまとめ
 jcmd 1つでとても広い範囲をカバーする
 ドメインが7つある
• VM, Compiler, GC, Thread, JVMTI, JFR,
ManagementAgent (+ Perfcounter.print)
 jstackやjmapは忘れてよい
34
© 2021 NTT DATA Corporation
JAVA_HOME/binディレクトリ
 Java 17: ここまでで5つ
© 2020 NTT DATA Corporation
ローカルだけ?
リモートのときは?
36
© 2021 NTT DATA Corporation
リモートのときは?
 jcmdはローカルプロセスのみ
 JMX経由で特定のMBeanを使えば
リモートでもjcmdと同等の機能が使える
 厳密に言えばリモートからは使えない機能もある
 JMXやMBeanについてはこのセッションの範囲外の
ため説明を省きます
37
© 2021 NTT DATA Corporation
アプリケーションへのJMXの設定
 起動オプションでの設定
 -Dcom.sun.management.jmxremote.port=9010
 他に認証やSSLの有効無効の設定
 -Dcom.sun.management.[authenticate|ssl]=false
38
© 2021 NTT DATA Corporation
jcmdのManagementAgentドメイン
 JMXエージェントの開始、終了
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
39
© 2021 NTT DATA Corporation
アプリケーションへのJMXの設定
 起動オプションでの設定
 -Dcom.sun.management.jmxremote.port=9010
 他に認証やSSLの有効無効の設定
 -Dcom.sun.management.[authenticate|ssl]=false
 jcmdでの設定
 jcmd <pid> ManagementAgent.start
jmxremote.port=9010
jmxremote.authenticate=false
jmxremote.ssl=false
40
© 2021 NTT DATA Corporation
JMXクライアント
 JMXエージェントに接続するツール
 JAVA_HOME/binにあるJMXクライアント
 jconsole
41
© 2021 NTT DATA Corporation
jconsole
 引数を必要とするMBeanの操作は実行できない
42
© 2021 NTT DATA Corporation
JMXクライアント
 JAVA_HOME/binにあるJMXクライアント
 jconsole
 他入手できるJMXクライアント
 JDK Mission Control (JMC)
 VisualVM JMC、VisualVMとも
今はJDKに含まれません
43
© 2021 NTT DATA Corporation
JDK Mission Control (JMC)
 引数を必要とするMBeanの操作も実行できる
44
© 2021 NTT DATA Corporation
JMXクライアント
 JAVA_HOME/binにあるJMXクライアント
 jconsole
 他入手できるJMXクライアント
 JDK Mission Control (JMC)
 VisualVM
 Javaコードを書く
 javax.managementパッケージ
45
© 2021 NTT DATA Corporation
脱線: コードでJMXを経由しMBeanを操作する
JMXServiceURL url =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://[host]:[port]/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url, null);
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName objectName =
new ObjectName("com.sun.management:type=DiagnosticCommand");
String operationName = "threadPrint";
String[] signature = new String[]{String[].class.getName()};
String result = (String) connection.invoke(objectName, operationName,
new Object[] { null }, signature);
 DiagnosticCommandMBeanでスレッドダンプ
46
© 2021 NTT DATA Corporation
DiagnosticCommandMBean
 jcmdにある機能のほぼすべてを使用できる
47
© 2021 NTT DATA Corporation
JMXの利用まとめ
 起動後でもjcmdでJMXエージェントを起動できる
 JMXクライアントはGUIツールを使用することも
コードで実装することもできる
 GUIツールはJMCを別途ダウンロードするのがよい
• jconsoleを積極的に推す理由はおそらくない
48
© 2021 NTT DATA Corporation
JAVA_HOME/binディレクトリ
 Java 17: ここまでで6つ
© 2020 NTT DATA Corporation
フライトレコードの
取り扱い
50
© 2021 NTT DATA Corporation
フライトレコード
 JDK Flight Recorder
 フライトレコーダ自体の解説は省きます
 起動オプションでのフライトレコード設定
 -XX:StartFlightRecording=dumponexit=true,
filename=./app.jfr
51
© 2021 NTT DATA Corporation
jcmdのJFRドメイン
 JDK Flight Recorderの開始、終了、設定変更
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
52
© 2021 NTT DATA Corporation
jcmdでのフライトレコード取得
 コマンド例
 jcmd <pid> JFR.start duration=1m filename=app.jfr
 jcmd <pid> JFR.stop
 jcmd <pid> JFR.dump filename=app.jfr
53
© 2021 NTT DATA Corporation
フライトレコードの分析
 分析ツール
 JDK Mission Control (JMC)
 jfrコマンド
54
© 2021 NTT DATA Corporation
jfrコマンド
 jfr [サブコマンド] ... jfrファイル
サブコマンド 内容
summary フライトレコードの統計を出力する
print フライトレコードのコンテンツを出力する
assemble 複数のjfrファイルを1つにまとめる
disassemble jfrファイルを複数に分割する
metadata
メタデータとしてイベントそのものに関する情報を
出力する
55
© 2021 NTT DATA Corporation
jfrコマンドを実行する
56
© 2021 NTT DATA Corporation
JFRまとめ
 起動後にjcmdでフライトレコードを取得できる
 jfrコマンド
 GUIツールを起動せずにフライトレコードの内容を確
認できる便利さ
• 確認する内容がはっきりしているとき
• GUIツールを使えないとき
57
© 2021 NTT DATA Corporation
JAVA_HOME/binディレクトリ
 Java 17: ここまでで7つ
© 2020 NTT DATA Corporation
クラッシュ解析
59
© 2021 NTT DATA Corporation
クラッシュしてcoreファイルが生成されたとき
 GDB...(Linux環境を想定)
 JAVA_HOME/binと関わりはありません
 HotSpot VMがC++である以上避けて通れません
 クラッシュ環境と同一環境を作りましょう
 GDBで解析
 OpenJDKでdebuginfoがあるときはうれしい
 Oracle JDKならデバッグ情報なしでがんばる
60
© 2021 NTT DATA Corporation
C++の世界とJavaの世界を行き来する
 GDBとHSDBの両方を使う
 HSDBとはHotSpot Debuggerのこと
jhsdbからも
取得できる
この3つを
解説
61
© 2021 NTT DATA Corporation
jhsdbコマンド
 jhsdb [mode] ...
 HSDBのデバッグサーバを起動すれば
リモートからGUIのHSDBで接続して解析できる
• リモートではJDKとcoreファイルでデバッグサーバを起動
mode 内容
hsdb GUIのHSDB起動
clhsdb コマンドラインのHSDB起動
debugd デバッグサーバ起動
JavaプロセスがダンプしたコアファイルをjhsdbとGDBで見る - Fight the Future https://www.sakatakoichi.com/entry/jhsdb_gdb
62
© 2021 NTT DATA Corporation
jhsdb hsdb|clhsdb
 jhsdb hsdb|clhsdb [オプション]
 プロセスIDを指定する
• --pid 9999
• macOSでSIP(System Integrity Protection)が有効だとエラー
- csrutilコマンド
 コアファイルと実行コマンドを指定する
• --core core_file --exe [JAVA_HOME]/bin/java
 デバッグサーバに接続する
• --connect ホスト名:ポートなど
GUIのHSDBであれば
画面からも指定できる
63
© 2021 NTT DATA Corporation
GUIのHSDB
64
© 2021 NTT DATA Corporation
クラッシュ解析
 HSDBでアドレスを調べて
GDBに戻ってデバッグして…
 逆の順も
65
© 2021 NTT DATA Corporation
CLHSDB
66
© 2021 NTT DATA Corporation
CLHSDBでヒストグラムを取得する
67
© 2021 NTT DATA Corporation
Java 16だとここがバグ
68
© 2021 NTT DATA Corporation
バグ修正
https://github.com/openjdk/jdk/pull/3087/files
intで扱っているから
ヒープサイズが大きいとバグが現れる
69
© 2021 NTT DATA Corporation
JAVA_HOME/binディレクトリ
 今日は以下の8つのコマンドを紹介しました! in Java 17
70
© 2021 NTT DATA Corporation
まとめ
 jcmd 1つでいろいろなことができる
 jhsdbはクラッシュ解析に使える
 新しいバージョンのJavaを使おう
 jcmdなどコマンドにも機能追加、改善が入るため
障害解析という観点でも新しい方がよい
© 2021 NTT DATA Corporation 71
明日からもJVMライフを
一緒に楽しく過ごしましょう!!
© 2021 NTT DATA Corporation
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)

  • 1.
    © 2021 NTTDATA Corporation JAVA_HOME/binにあるコマンド、いくつ使っていますか? [JVM関連ツール編] 2021年10月7日 JJUGナイトセミナー 株式会社NTTデータ 阪田 浩一
  • 2.
    2 © 2021 NTTDATA Corporation 自己紹介  株式会社NTTデータ 所属  OpenJDK関連の研究開発  Javaでのサポート、トラブルシュート、障害解析  Javaチャンピオン  OpenJDK Author (開発者権限が少しある)  とにかくJVMに(詳しく)なりたい 阪田 浩一 jyukutyo
  • 3.
    3 © 2021 NTTDATA Corporation このセッションの対象と想定している方  Javaアプリケーションの開発運用をしている方  トラブルシュート経験がある方には "復習"となります 入門的な内容です!
  • 4.
    © 2020 NTTDATA Corporation JAVA_HOME/binにある コマンド
  • 5.
    5 © 2021 NTTDATA Corporation JAVA_HOME/binディレクトリ  Java 8 : 43個  Java 17: 28個
  • 6.
    6 © 2021 NTTDATA Corporation https://docs.oracle.com/en/java/javase/17/docs/specs/man/index.html 28個ある
  • 7.
    7 © 2021 NTTDATA Corporation このセッションでの"解析ツール"の範囲  問題(障害、不具合など)を解決する  データ取得、収集ツール  収集したデータの解析(可視化)ツール
  • 8.
    8 © 2021 NTTDATA Corporation このセッションでの"解析ツール"の範囲  問題(障害、不具合など)を解決する  データ取得、収集ツール • 収集に関する設定の追加変更を含む  収集したデータの解析(可視化)ツール
  • 9.
    © 2020 NTTDATA Corporation その要求 このコマンドで 満たせます
  • 10.
    10 © 2021 NTTDATA Corporation 要求 No.1  障害発生!今後再発したらすぐスレッドダンプを 取っておいて!  jcmdコマンドでスレッドダンプを取ろう  jstackコマンドは使わない https://docs.oracle.com/en/java/javase/17/troubleshoot/diagnostic-tools.html#GUID-36CBAF37-0B61-4455-9183-1268E6D497DD
  • 11.
    11 © 2021 NTTDATA Corporation 要求 No.2  フライトレコードを取りたい! アプリケーションは再起動させずにね!  jcmdコマンドでレコーディングを開始しよう
  • 12.
    12 © 2021 NTTDATA Corporation 要求 No.3  Unified Loggingのログ出力を設定したい! アプリケーションは再起動させずにね!  jcmdコマンドでULログ出力を設定しよう
  • 13.
    13 © 2021 NTTDATA Corporation 結論  jcmdがあれば何でもできる!  注: ↑は誇張表現です  対象はローカルプロセスのみ  jcmd <pid|main_class> command ... • pidはプロセスIDのこと • 以降pidの方を使います
  • 14.
    14 © 2021 NTTDATA Corporation 前述の要求を実現するjcmdのコマンド  要求 No.1: スレッドダンプ取得  jcmd <pid> Thread.print  要求 No.2: フライトレコード開始  jcmd <pid> JFR.start duration=1m filename=app.jfr  要求 No.3: ログ設定追加  jcmd <pid> VM.log output="sample.log" output_options="filecount=3"
  • 15.
    15 © 2021 NTTDATA Corporation jcmdでのコマンドのドメイン ドメイン 内容 VM JVMの実行情報取得 ログ設定など Compiler JITコンパイラ関連 GC ガベージコレクション関連 Thread 現状スレッドダンプのみ JVMTI JVM Tool Interface関連 エージェントのロードなど JFR フライトレコード関連 ManagementAgent JMXエージェント関連  jcmd <pid> command (ドメイン.操作という形式)  コマンドとは別個の命令としてPerfcounter.printもある
  • 16.
    16 © 2021 NTTDATA Corporation pidを調べる  pidとはプロセスIDのこと  jcmdで調べられる!  以前からあるjpsでもOK - 2つはオプションに差異あり
  • 17.
    17 © 2021 NTTDATA Corporation 利用できるコマンドを確認するには  jcmd <pid> help
  • 18.
    © 2021 NTTDATA Corporation 18 各ドメインを概観します
  • 19.
    19 © 2021 NTTDATA Corporation Threadドメイン  jcmd <pid> Thread.print のみ
  • 20.
    20 © 2021 NTTDATA Corporation 各コマンドの詳細を確認するには  jcmd <pid> help command
  • 21.
    21 © 2021 NTTDATA Corporation VMドメイン  JVM関連の情報取得、設定変更 VM.classloader_stats VM.print_touched_methods VM.class_hierarchy VM.set_flag VM.command_line VM.stringtable VM.dynlibs VM.symboltable VM.info VM.systemdictionary VM.log VM.system_properties VM.flags VM.uptime VM.native_memory VM.version
  • 22.
    22 © 2021 NTTDATA Corporation VMドメイン  JVM関連の情報取得、設定変更 VM.classloader_stats VM.print_touched_methods VM.class_hierarchy VM.set_flag VM.command_line VM.stringtable VM.dynlibs VM.symboltable VM.info VM.systemdictionary VM.log VM.system_properties VM.flags VM.uptime VM.native_memory VM.version
  • 23.
    23 © 2021 NTTDATA Corporation 脱線: Java 16のjcmdにおけるULログ設定バグ
  • 24.
    24 © 2021 NTTDATA Corporation 脱線: jcmdのバグ修正 https://bugs.openjdk.java.net/browse/JDK-8265047
  • 25.
    25 © 2021 NTTDATA Corporation
  • 26.
    26 © 2021 NTTDATA Corporation 脱線: Java 17のjcmdでのULログ
  • 27.
    27 © 2021 NTTDATA Corporation 脱線: jcmdのバグ修正  jcmd, jhsdb (後述) などのコマンド関連では Java 17に対して3つほどコントリビュートできた  コマンドは試しやすいのでバグを見つけられるかも!  試すうちにJVMの知識もつき労力対効果がよい!
  • 28.
    28 © 2021 NTTDATA Corporation GCドメイン  ガベージコレクションの情報取得 GC.class_histogram GC.finalizer_info GC.heap_dump GC.heap_info GC.run GC.run_finalization
  • 29.
    29 © 2021 NTTDATA Corporation Compilerドメイン  JITコンパイラの情報取得、取得設定 Compiler.codecache Compiler.codelist Compiler.queue Compiler.directives_add Compiler.directives_clear Compiler.directives_print Compiler.directives_remove
  • 30.
    30 © 2021 NTTDATA Corporation JVMTIドメイン  JVM Tool Interface関連 JVMTI.agent_load JVMTI.data_dump
  • 31.
    31 © 2021 NTTDATA Corporation ManagementAgentドメイン、JFRドメイン  後で詳しく説明します
  • 32.
    32 © 2021 NTTDATA Corporation 使わなくなったコマンドたち  jcmdで同様のことができるコマンド  jstack  jinfo • jcmd VMドメインにあるコマンドたちを使用  jmap • 例) ヒープダンプ: GC.heap_dump <filename> • 例) ヒープヒストグラム: GC.class_histogram
  • 33.
    33 © 2021 NTTDATA Corporation jcmdまとめ  jcmd 1つでとても広い範囲をカバーする  ドメインが7つある • VM, Compiler, GC, Thread, JVMTI, JFR, ManagementAgent (+ Perfcounter.print)  jstackやjmapは忘れてよい
  • 34.
    34 © 2021 NTTDATA Corporation JAVA_HOME/binディレクトリ  Java 17: ここまでで5つ
  • 35.
    © 2020 NTTDATA Corporation ローカルだけ? リモートのときは?
  • 36.
    36 © 2021 NTTDATA Corporation リモートのときは?  jcmdはローカルプロセスのみ  JMX経由で特定のMBeanを使えば リモートでもjcmdと同等の機能が使える  厳密に言えばリモートからは使えない機能もある  JMXやMBeanについてはこのセッションの範囲外の ため説明を省きます
  • 37.
    37 © 2021 NTTDATA Corporation アプリケーションへのJMXの設定  起動オプションでの設定  -Dcom.sun.management.jmxremote.port=9010  他に認証やSSLの有効無効の設定  -Dcom.sun.management.[authenticate|ssl]=false
  • 38.
    38 © 2021 NTTDATA Corporation jcmdのManagementAgentドメイン  JMXエージェントの開始、終了 ManagementAgent.start ManagementAgent.start_local ManagementAgent.status ManagementAgent.stop
  • 39.
    39 © 2021 NTTDATA Corporation アプリケーションへのJMXの設定  起動オプションでの設定  -Dcom.sun.management.jmxremote.port=9010  他に認証やSSLの有効無効の設定  -Dcom.sun.management.[authenticate|ssl]=false  jcmdでの設定  jcmd <pid> ManagementAgent.start jmxremote.port=9010 jmxremote.authenticate=false jmxremote.ssl=false
  • 40.
    40 © 2021 NTTDATA Corporation JMXクライアント  JMXエージェントに接続するツール  JAVA_HOME/binにあるJMXクライアント  jconsole
  • 41.
    41 © 2021 NTTDATA Corporation jconsole  引数を必要とするMBeanの操作は実行できない
  • 42.
    42 © 2021 NTTDATA Corporation JMXクライアント  JAVA_HOME/binにあるJMXクライアント  jconsole  他入手できるJMXクライアント  JDK Mission Control (JMC)  VisualVM JMC、VisualVMとも 今はJDKに含まれません
  • 43.
    43 © 2021 NTTDATA Corporation JDK Mission Control (JMC)  引数を必要とするMBeanの操作も実行できる
  • 44.
    44 © 2021 NTTDATA Corporation JMXクライアント  JAVA_HOME/binにあるJMXクライアント  jconsole  他入手できるJMXクライアント  JDK Mission Control (JMC)  VisualVM  Javaコードを書く  javax.managementパッケージ
  • 45.
    45 © 2021 NTTDATA Corporation 脱線: コードでJMXを経由しMBeanを操作する JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://[host]:[port]/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(url, null); MBeanServerConnection connection = connector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("com.sun.management:type=DiagnosticCommand"); String operationName = "threadPrint"; String[] signature = new String[]{String[].class.getName()}; String result = (String) connection.invoke(objectName, operationName, new Object[] { null }, signature);  DiagnosticCommandMBeanでスレッドダンプ
  • 46.
    46 © 2021 NTTDATA Corporation DiagnosticCommandMBean  jcmdにある機能のほぼすべてを使用できる
  • 47.
    47 © 2021 NTTDATA Corporation JMXの利用まとめ  起動後でもjcmdでJMXエージェントを起動できる  JMXクライアントはGUIツールを使用することも コードで実装することもできる  GUIツールはJMCを別途ダウンロードするのがよい • jconsoleを積極的に推す理由はおそらくない
  • 48.
    48 © 2021 NTTDATA Corporation JAVA_HOME/binディレクトリ  Java 17: ここまでで6つ
  • 49.
    © 2020 NTTDATA Corporation フライトレコードの 取り扱い
  • 50.
    50 © 2021 NTTDATA Corporation フライトレコード  JDK Flight Recorder  フライトレコーダ自体の解説は省きます  起動オプションでのフライトレコード設定  -XX:StartFlightRecording=dumponexit=true, filename=./app.jfr
  • 51.
    51 © 2021 NTTDATA Corporation jcmdのJFRドメイン  JDK Flight Recorderの開始、終了、設定変更 JFR.check JFR.configure JFR.dump JFR.start JFR.stop
  • 52.
    52 © 2021 NTTDATA Corporation jcmdでのフライトレコード取得  コマンド例  jcmd <pid> JFR.start duration=1m filename=app.jfr  jcmd <pid> JFR.stop  jcmd <pid> JFR.dump filename=app.jfr
  • 53.
    53 © 2021 NTTDATA Corporation フライトレコードの分析  分析ツール  JDK Mission Control (JMC)  jfrコマンド
  • 54.
    54 © 2021 NTTDATA Corporation jfrコマンド  jfr [サブコマンド] ... jfrファイル サブコマンド 内容 summary フライトレコードの統計を出力する print フライトレコードのコンテンツを出力する assemble 複数のjfrファイルを1つにまとめる disassemble jfrファイルを複数に分割する metadata メタデータとしてイベントそのものに関する情報を 出力する
  • 55.
    55 © 2021 NTTDATA Corporation jfrコマンドを実行する
  • 56.
    56 © 2021 NTTDATA Corporation JFRまとめ  起動後にjcmdでフライトレコードを取得できる  jfrコマンド  GUIツールを起動せずにフライトレコードの内容を確 認できる便利さ • 確認する内容がはっきりしているとき • GUIツールを使えないとき
  • 57.
    57 © 2021 NTTDATA Corporation JAVA_HOME/binディレクトリ  Java 17: ここまでで7つ
  • 58.
    © 2020 NTTDATA Corporation クラッシュ解析
  • 59.
    59 © 2021 NTTDATA Corporation クラッシュしてcoreファイルが生成されたとき  GDB...(Linux環境を想定)  JAVA_HOME/binと関わりはありません  HotSpot VMがC++である以上避けて通れません  クラッシュ環境と同一環境を作りましょう  GDBで解析  OpenJDKでdebuginfoがあるときはうれしい  Oracle JDKならデバッグ情報なしでがんばる
  • 60.
    60 © 2021 NTTDATA Corporation C++の世界とJavaの世界を行き来する  GDBとHSDBの両方を使う  HSDBとはHotSpot Debuggerのこと jhsdbからも 取得できる この3つを 解説
  • 61.
    61 © 2021 NTTDATA Corporation jhsdbコマンド  jhsdb [mode] ...  HSDBのデバッグサーバを起動すれば リモートからGUIのHSDBで接続して解析できる • リモートではJDKとcoreファイルでデバッグサーバを起動 mode 内容 hsdb GUIのHSDB起動 clhsdb コマンドラインのHSDB起動 debugd デバッグサーバ起動 JavaプロセスがダンプしたコアファイルをjhsdbとGDBで見る - Fight the Future https://www.sakatakoichi.com/entry/jhsdb_gdb
  • 62.
    62 © 2021 NTTDATA Corporation jhsdb hsdb|clhsdb  jhsdb hsdb|clhsdb [オプション]  プロセスIDを指定する • --pid 9999 • macOSでSIP(System Integrity Protection)が有効だとエラー - csrutilコマンド  コアファイルと実行コマンドを指定する • --core core_file --exe [JAVA_HOME]/bin/java  デバッグサーバに接続する • --connect ホスト名:ポートなど GUIのHSDBであれば 画面からも指定できる
  • 63.
    63 © 2021 NTTDATA Corporation GUIのHSDB
  • 64.
    64 © 2021 NTTDATA Corporation クラッシュ解析  HSDBでアドレスを調べて GDBに戻ってデバッグして…  逆の順も
  • 65.
    65 © 2021 NTTDATA Corporation CLHSDB
  • 66.
    66 © 2021 NTTDATA Corporation CLHSDBでヒストグラムを取得する
  • 67.
    67 © 2021 NTTDATA Corporation Java 16だとここがバグ
  • 68.
    68 © 2021 NTTDATA Corporation バグ修正 https://github.com/openjdk/jdk/pull/3087/files intで扱っているから ヒープサイズが大きいとバグが現れる
  • 69.
    69 © 2021 NTTDATA Corporation JAVA_HOME/binディレクトリ  今日は以下の8つのコマンドを紹介しました! in Java 17
  • 70.
    70 © 2021 NTTDATA Corporation まとめ  jcmd 1つでいろいろなことができる  jhsdbはクラッシュ解析に使える  新しいバージョンのJavaを使おう  jcmdなどコマンドにも機能追加、改善が入るため 障害解析という観点でも新しい方がよい
  • 71.
    © 2021 NTTDATA Corporation 71 明日からもJVMライフを 一緒に楽しく過ごしましょう!!
  • 72.
    © 2021 NTTDATA Corporation 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です