Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

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

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité

Consultez-les par la suite

1 sur 72 Publicité

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

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

2021年10月7日

株式会社NTTデータ
技術開発本部 先進コンピューティング技術センタ
阪田 浩一

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

2021年10月7日

株式会社NTTデータ
技術開発本部 先進コンピューティング技術センタ
阪田 浩一

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

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

Publicité

Plus par NTT DATA Technology & Innovation (20)

Plus récents (20)

Publicité

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

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

×