はじめに
この記事はJava Advent Calendar 2016の 1 日目の記事です
先日の Java Casual #2) で jcmd について話してきました。
jcmd は Oracle 社のドキュメントでは推奨ツールとして扱われており、jps や jmap, jstat のような既存ツールは "Experimental" とされています。このため、既存ツールから jcmd への移行が進められる可能性があります。例えば Experimental であった jhat は Java 9 から削除されます。
Java 9 からの新機能を含めた jcmd の各種機能は上記スライドを見ていただくとして、ここでは jcmd でどのように既存ツール相当の機能が使えるかを紹介したいと思います
jcmd とは
jcmd はローカル JVM プロセスの診断をコマンドラインから行うツールです。
どのような診断が行えるかは、対象となる JVM プロセスの Java のバージョンに依存します。これは下記スライドの Dynamic Attach という機構を利用して jcmd コマンドを Target JVM プロセスに送っているだけで、実際の処理は JVM プロセスが行っているためです。
実行可能な診断コマンドは以下で確認ができます。
$ jcmd <pid | main-class> help
jcmd と既存ツールの対応
既存ツール相当の機能の使い方は以下の通り。jcmd と既存ツールを比較した時に長所・短所があればそれも紹介しています。
jstack
$ jcmd <pid|main-class> Thread.print
- 長所/短所:特になし
jmap
ヒープダンプ出力 (jmap -dump)
jmap -dump:file=filepath $ jcmd <pid|main-class> GC.heap_dump file
- 長所:-all オプションを付けることで非参照オブジェクトも含めてダンプできる
- 短所:特になし
ヒープヒストグラム (jmap -histo)
jmap -histo $ jcmd <pid|main-class> GC.class_histogram -all jmap -histo:live $ jcmd <pid|main-class> GC.class_histogram
- 長所/短所:特になし
jinfo
JVM 情報出力 (jinfo)
$ jcmd <pid|main-class> PerfCounter.print
- 短所:jstat と同じくJVM 情報が未フィルタ状態で全部出る
JVM フラグの設定 (jinfo -flag)
$ jcmd <pid|main-class> VM.set_flag <flag name> <string value>
- 長所/短所:特になし
- 注意:設定できる JVM オプションは一部です。
JVM フラグ一覧の表示 (jinfo -flags)
$ jcmd <pid|main-class> VM.flags
- 長所:-all オプションを付けることでサポートされている全フラグを出力する
JVM フラグ一覧の表示 (jinfo -sysprops)
$ jcmd <pid|main-class> VM.system_properties
- 長所/短所:特になし