unnamed

Javaとか、http://twitter.com/sugarlife

jcmd と既存ツールの対応

はじめに

この記事は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 と既存ツールを比較した時に長所・短所があればそれも紹介しています。

jps
$ jcmd 
または
$ jcmd -l
  • 短所: jps -lv 相当の情報が取れない。arguments の詳細度が低い
jstat
$ jcmd <pid|main-class> PerfCounter.print
  • 短所:JVM 情報が未フィルタ状態で全部出るため読み辛い。要フィルタ
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 
  • 長所/短所:特になし

最後に

jcmd は既存ツールの置換えが主目的ではなく、Javaプロセスの診断や起動後から設定変更を行えるなど、非常に強力なツールです。Java 9 で多くの機能が追加されますが、まだまだ役不足な面もあるかと思います。こういう機能があれば非常に役に立つのではないか、この機能はこうした方がより良いのではないかといった提案はコミュニティにとっても有用だと思いますので、是非トライしてみて欲しいと考えています :)