jcmdユーティリティを使用してJVMに診断コマンド・リクエストを送信し、JVMではこれらのリクエストを使用してJavaフライト記録の制御、トラブルシューティング、JVMおよびJavaアプリケーションの診断を行います。 JVMが実行されているものと同じマシン上で使用され、JVMの起動で使用されたものと同じ有効なユーザーおよびグループ識別子を持っている必要があります。
jcmdの構文および他の使用方法の詳細は、jcmdコマンドのマニュアル・ページを参照してください。
特殊コマンドjcmd <process id/main class> PerfCounter.printは、プロセス内のすべてのパフォーマンス・カウンタを出力します。
コマンドjcmd <process id/main class> <command> [options]は、JVMに実際のコマンドを送信します。
例2-1に、jcmdユーティリティによるJVMへの診断コマンド・リクエストを示します。
例2-1 jcmdユーティリティによる診断コマンド・リクエスト
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
> jcmd MyProgram help (or "jcmd 2125 help")
2125:
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
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
> jcmd MyProgram help Thread.print
2125:
Thread.print
Print all threads with stacktraces.
Impact: Medium: Depends on the number of threads.
Permission: java.lang.management.ManagementPermission(monitor)
Syntax : Thread.print [options]
Options: (options must be specified using the <key> or <key>=<value> syntax)
-l : [optional] print java.util.concurrent locks (BOOLEAN, false)
> jcmd MyProgram Thread.print
2125:
2014-07-04 15:58:56
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.0-b69 mixed mode):
...
次の項では、jcmdユーティリティでの便利なコマンドおよびトラブルシューティング手法について説明します。
使用可能な診断コマンドはHotSpot VMのバージョンごとに異なる場合があるので、jcmd <process id/main class> helpを使用して、使用可能なすべてのオプションを確認することをお薦めします。 JDK 8以降のツールに含まれている非常に役立つコマンドの一部を次に示します。 jcmd <process id/main class> help <command>を使用すれば、該当するコマンドのその他のオプションをいつでも確認できることを覚えておいてください。
HotSpotおよびJDKのバージョンIDの出力
jcmd <process id/main class> VM.version
VMに設定されているすべてのシステム・プロパティの出力
数百行の情報が表示される可能性があります。
jcmd <process id/main class> VM.system_properties
VMで使用されるすべてのフラグの出力
フラグを指定していない場合でも、いくつかのデフォルト値(初期ヒープ・サイズや最大ヒープ・サイズなど)が表示されます。
jcmd <process id/main class> VM.flags
稼働時間(秒)の出力
jcmd <process id/main class> VM.uptime
クラス・ヒストグラムの作成
出力結果が冗長になる可能性があるので、出力をファイルにリダイレクトできます。 内部クラスとアプリケーション固有のクラスの両方がリストに含まれます。 メモリーの消費量が最も多いクラスから降順に表示されます。
jcmd <process id/main class> GC.class_histogram
ヒープ・ダンプ(hprofダンプ)の作成
jcmd GC.heap_dump filename=Myheapdump
これはjmap -dump:file=<file> <pid>を使用する方法と同じですが、推奨ツールはjcmdです。
ヒープ・ヒストグラムの作成
jcmd <process id/main class> GC.class_histogram filename=Myheaphistogram
これはjmap -histo <pid>を使用する方法と同じですが、推奨ツールはjcmdです。
スタック・トレースのあるすべてのスレッドの出力
jcmd <process id/main class> Thread.print
jcmdユーティリティでは、次のトラブルシューティング・オプションを使用できます。
記録の開始
たとえば、識別子が7060の実行中Javaプロセスで2分間の記録を開始し、それを現在のディレクトリのmyrecording.jfrに保存するには、次を使用します。
jcmd 7060 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=C:\TEMP\myrecording.jfr
記録の確認
JFR.check診断コマンドは、実行中の記録を確認します。 たとえば:
jcmd 7060 JFR.check
記録の停止
JFR.stop診断コマンドは、実行中の記録を停止し、記録データを破棄することもできます。 たとえば:
jcmd 7060 JFR.stop
記録のダンプ
JFR.dump診断コマンドは、実行中の記録を停止し、記録をファイルにダンプすることもできます。 たとえば:
jcmd 7060 JFR.dump name=MyRecording filename=C:\TEMP\myrecording.jfr
ヒープ・ダンプの作成
ヒープ・ダンプを作成する推奨方法を次に示します。
jcmd <pid> GC.heap_dump filename=Myheapdump
ヒープ・ヒストグラムの作成
ヒープ・ヒストグラムを作成する推奨方法を次に示します。
jcmd <pid> GC.class_histogram filename=Myheaphistogram