JVM周辺ツールについてまとめる
はじめに
JVMの周辺ツールをたまに使用するが、使うタイミングで毎回調べているので、一度しっかりとまとめようと思う。
実行結果はJava8のものになります。
jcmd
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jcmd.html#CIHEEDIB
JDKをインストールした時に付属している。
JMVに対して診断コマンドを送ることができる。
フライトレコーダーの制御や、GCを強制的に起動させるいった操作が可能。
Java9ではコマンドが増えている。
主に使っている機能は下記
- JFRの制御
- スレッドダンプ
# プロセス番号の確認 $ jcmd 5361 sun.tools.jcmd.JCmd 5146 info.repli.sample.mbeans.Hello # 送信できる診断コマンドの一覧 $ jcmd 5164 help 5146: The following commands are available: JFR.stop JFR.start JFR.dump JFR.check VM.native_memory VM.check_commercial_features VM.unlock_commercial_features ManagementAgent.stop ManagementAgent.start_local ManagementAgent.start GC.rotate_log Thread.print GC.class_stats GC.class_histogram GC.heap_dump GC.run_finalization GC.run VM.uptime VM.flags VM.system_properties VM.command_line VM.version help For more information about a specific command use 'help <command>'. # JFRの起動 ## 商用機能のアンロック jcmd 5146 VM.unlock_commercial_features ##起動 jcmd 5146 JFR.start filename=/tmp/`hostname`-`date -u +"%Y-%m-%d"`.jfr duration=180s settings=$JAVA_HOME/jre/lib/jfr/default.jfc # スレッドダンプ jcmd 5146 Thread.print # GC実行 jcmd 5146 GC.run # System.gc() jcmd 5146 GC.run_finallization # System.runFinalization()
jconsole
JVMの情報や、提供されているMBean情報の取得、操作ができるGUIツール。
JDKをインストールすると付属している。
https://docs.oracle.com/javase/jp/7/technotes/guides/management/jconsole.html
# 起動 $ jconsole
リモートのプロセスに接続することも可能。
jmxterm
MBean情報の取得、操作がコマンドラインでできるツール。
JDKとは別にインストールする必要あり。
後述するSJKのmxコマンドでも同じことはできる。
ダウンロード
http://wiki.cyclopsgroup.org/jmxterm/download.html
使い方
ダウンロードした jmxterm-1.0.0-uber.jar をJMXコンソールにアクセスしたいサーバに持っていく。
インタラクティブに使用
# java -jar jmxterm-1.0.0-uber.jar -u <USER> -p <PASS> -l <hostname> Welcome to JMX terminal. Type "help" for available commands. $> beans #MBeanの一覧が出力される ... $> get <取得したいMBeanのAttributeを指定>
JFRとJMC
JFR : https://docs.oracle.com/javacomponents/jp/jmc-5-4/jfr-runtime-guide/about.htm
JMC : https://docs.oracle.com/javacomponents/jp/jmc-5-5/jmc-user-guide/jmc.htm
※ JFR(Java Flight Recoder)とJMCは共に本番環境で使用するには商用ライセンスが必要になる。
そういえば、去年、JFRがOpenJDKに寄贈されるってブログにかかれて少し話題になっていたけど、その進捗どんな感じなんだろう。
https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se
jcmd等からJFRを起動し、出力されたファイルをJMCで読むことで、JFRを実行していた間のJVMの様々な情報が確認できる。
ちなみにJava9からはJMCのUIが大幅に変わっています。
SJK(Swiss Java Knife)
https://github.com/aragozin/jvm-tools
JVMのトラブルシューティングに便利なツール群
付属しているコマンドは下記
- ttop : topコマンドのJVMのようなもの、スレッド単位でのCPU使用率を表示する
- jps : JVMのプロセス表示、jcmdを引数なしで実行した場合と同じだが、フィルタや表示のカスタマイズができる
- hh : ヒープヒストグラム表示、jcmdのGC.class_histogramの高機能版、オプション次第ではフルGCが発生する
- gc : GCの実行状態を監視して表示
- mx : MBean情報の取得と操作、jconsoleやjmxtermと同じことができる
- stcap : スレッドダンプと一定期間取得
- ssa : stcapで取得したスレッドダンプを解析
- stcpy : スレッドダンプファイルをまとめたり、フィルタしたりといった操作を実施
おわりに
基本的にはjcmdとSJKを抑えておけば問題ないと思います。
自分はSJKの存在を知る前にjconsoleとjmxtermを使っていたのでMBean系の操作はこの2つを使用し続けてます。