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

f:id:replicity:20180213013905p:plain
f:id:replicity:20180213013907p:plain

リモートのプロセスに接続することも可能。

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が大幅に変わっています。

f:id:replicity:20180213013910p:plain

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つを使用し続けてます。