Java7(JDK1.7)からjcmd
という診断ツールが追加されました。
元はJrockitというVM(Oracleが買収したBEAが開発してきてたJavaVM)に付属していたjrcmd
を移植したツールです。
Java6までの方法も継続して使えますが、折角なのでjcmdを使った方法も試してましょう。
(※JDK7u4以降で使用可能です。)
JavaプロセスID取得
$ jcmd
jps -l
と同じ
スレッドダンプ出力
$ jcmd <pid> Thread.print
jstack <pid>
と同じ
ヒープダンプ出力
$ jcmd <pid> GC.heap_dump /fullpath/to/dump_file
jmap -dump:format=b,file=/fullpath/to/dump_file <pid>
と同じ
他のコマンド
とまぁ、基本的に既存コマンドの代替が多いですが、jcmdには他にも以下の様なコマンドが用意されています。
書式
$ jcmd <pid> <command> <option>
コマンド一覧
- VM.uptime
起動時間(秒)
- VM.flags
起動オプションの表示
- VM.flags -all
全オプションの値表示
- VM.system_properties
Systemプロパティの表示
- VM.command_line
起動時のコマンドライン表示
- VM.version
バージョン表示
- GC.run
System.gc()の実行
- GC.run_finalization
System#runFinalization()
の実行 - GC.class_histogram
ヒープ上のインスタンス数、バイト数出力
備考
javaのプロセス出力だけで言えば、
jps -lv
が起動時のコマンドまで出力してくれて、複数のjavaプロセスが動いているときなどに把握しやすかったりするなど、既存のコマンドが不要になったわけではありません。
また、jcmd
でぐぐってもj r cmd (jrockit付属時のコマンド名)が多く引っかかったりするなど、どれだけ使われているのかも甚だ疑問です。(既存のコマンドで代替可能だし)
とはいえ、バージョン表示やSystemプロパティなどが取得しやすくなっていたりするのでツールは目的に応じて使い分けていくのがいいと思います。