SlideShare a Scribd company logo
© 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
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

More Related Content

PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
Unified JVM Logging
PDF
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
PDF
Javaのログ出力: 道具と考え方
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PPTX
Metaspace
PPTX
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Unified JVM Logging
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Javaのログ出力: 道具と考え方
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Metaspace
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)

What's hot (20)

PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
PPTX
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PPTX
分散システムについて語らせてくれ
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
世界一わかりやすいClean Architecture
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
Java EE から Quarkus による開発への移行について
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
Mavenの真実とウソ
PDF
ClassLoader Leak Patterns
PPTX
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
コンテナの作り方「Dockerは裏方で何をしているのか?」
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
分散システムについて語らせてくれ
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
世界一わかりやすいClean Architecture
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
Java EE から Quarkus による開発への移行について
なかったらINSERTしたいし、あるならロック取りたいやん?
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
アーキテクチャから理解するPostgreSQLのレプリケーション
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
Mavenの真実とウソ
ClassLoader Leak Patterns
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
Ad

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

PPTX
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PPTX
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
PDF
Prometheus超基礎公開用.pdf
PPTX
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
PDF
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
PPTX
Serviceability Toolsの裏側
ODP
"Up" with vagrant and docker
PDF
.NET Gadgeteerでプロトタイピングする EnOceanエネルギーハーベスティング システム
PPTX
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
PPTX
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
PDF
マスタリング DEA/NG 第2版
PPTX
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
PDF
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
PDF
"Up" with vagrant and docker
PDF
OSSを活用したIaCの実現
PDF
脅威へ、しなやかかつ持続可能に対応するためのIaC環境 ~循環型IaC~ (CloudNative Security Conference 2022 プレ...
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
Prometheus超基礎公開用.pdf
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
Serviceability Toolsの裏側
"Up" with vagrant and docker
.NET Gadgeteerでプロトタイピングする EnOceanエネルギーハーベスティング システム
Let's Start Contributing to OpenJDK from Today!(Oracle Groundbreakers APAC Vi...
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
マスタリング DEA/NG 第2版
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
"Up" with vagrant and docker
OSSを活用したIaCの実現
脅威へ、しなやかかつ持続可能に対応するためのIaC環境 ~循環型IaC~ (CloudNative Security Conference 2022 プレ...
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Ad

More from NTT DATA Technology & Innovation (20)

PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)

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

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