Java 9のjcmdツールとは?JVM診断ツールの重要性と基本的な使い方を解説
jcmdツールとは何か
jcmdは、JVM(Java Virtual Machine)に組み込まれた診断(diagnostic)ツールです。ローカルマシン上で動作している指定したJVMプロセスに対して、コマンドラインから診断コマンドを実行するためのツールであり、パフォーマンス解析やトラブルシューティングに欠かせない存在となっています。
このツールはJava 7以降のJDKインストールに標準で含まれており、実体は「%java_home%\bin\jcmd.exe」というプログラムファイルです。環境変数「path」に「%java_home%\bin」ディレクトリが登録されていれば、どのディレクトリからでも直接jcmdコマンドを実行できます。
オプションを何も指定せずにjcmdを実行すると、ローカルマシン上のJavaプロセス一覧が表示されます。「jcmd -h」コマンドを実行すると、以下のように利用可能なすべてのオプションの一覧を確認できます。
C:\Users\User>jcmd -h
Usage: jcmd
or: jcmd -l
or: jcmd -h
command must be a valid jcmd command for the selected jvm.
Use the command "help" to see which commands are available.
If the pid is 0, commands will be sent to all Java processes.
The main class argument will be used to match (either partially
or fully) the class used to start Java.
If no options are given, lists Java processes (same as -l).
PerfCounter.print display the counters exposed by this process
-f read and execute commands from the file
-l list JVM processes on the local machine
-h this help主な使い方:動作中のJVMプロセスを確認する
まずはテスト用のシンプルなJavaプログラムを用意します。このプログラムは、ランタイムの空きメモリと合計メモリを表示した後、5秒間スリープすることで、診断コマンドを実行する猶予を作ります。
サンプルコード
public class JCmdToolTest {
public static void main(String args[]) {
Runtime runtime = Runtime.getRuntime();
System.out.println("Free memory: " + runtime.freeMemory());
System.out.println("Total memory: " + runtime.totalMemory());
try {
Thread.sleep(5000);
} catch(InterruptedException e) {
}
}
}実行結果
Free memory: 65454560 Total memory: 67108864
プログラムがスリープしている間に、「jcmd -l」コマンドを使うことで、ローカルマシン上で現在稼働しているすべてのJVMプロセスを一覧表示できます。出力結果に含まれるPID(プロセスID)またはメインクラス名を使って、対象となるJVMを特定し、個別の診断コマンドを送信することができます。
C:\Users\User>jcmd -l 6108 jdk.jcmd/sun.tools.jcmd.JCmd -l
jcmdツールが重要である理由
jcmdが重宝される理由は、外部ライブラリや追加ツールを導入することなく、JDK標準だけで高度な診断情報を取得できる点にあります。代表的な活用例としては以下のようなものがあります。
- ヒープの状態確認:「GC.heap_info」コマンドでガベージコレクション後のヒープ使用状況を把握できます。
- スレッドダンプの取得:「Thread.print」コマンドにより、デッドロック調査などに役立つ全スレッドのスタックトレースを出力できます。
- JVMフラグの確認・変更:「VM.flags」で起動時のJVMオプションを確認でき、一部のフラグは実行中に動的に変更することも可能です。
- ヒープダンプの取得:「GC.heap_dump」コマンドで、解析用のヒープダンプファイルを作成できます。
このようにjcmdは、従来jstack、jmap、jinfoなどの個別ツールで行っていた操作を一つのコマンドに集約できる統合診断ツールであり、本番環境での障害解析やパフォーマンスチューニングにおいて、Java開発者・運用者にとって非常に重要なツールといえます。
-
JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説
SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi
-
JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作
JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()