Javaで作ったプログラムはJVM(Java Virtual Machine)で動作します。
Javaはメモリ管理などの細かい部分をプログラマではなく、JVMが請け負っています。
そのため、プログラマはいろいろな制約をあまり気にすることなくプログラミングが可能、という利点があるのですが、大規模なプログラムでは動作状態が気になるもの。
それを監視するための仕様としてJMX(Java Management Extensions)というものがあります。
JVMに組み込まれているJMXに、APIを通じてアクセスすることでJVMの情報を閲覧することができます。
親切な事に、JDKには監視情報をグラフィカルに表示するためのツールであるjconsoleが同梱されています。
今回は、jconsoleを使ってJavaアプリケーションの情報の監視をするまでを書いていきます。
jconsoleでの監視
監視対象のプログラムを作成
まずは、監視対象となるプログラムを作成します。
jconsoleでは、動作中のプログラムに対して監視を行うため、すぐに終了しないプログラムが必要です。
今回は単純に1秒ごとに文字列を出力するプログラムを作ります。
package jp.frost;
public class Main {
public static void main(String args[]) {
while(true) {
System.out.println("Hello! JMX");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
プログラムを作成したら実行しておきます。
jconsoleの起動
まずは、jconsoleを起動します。
jconsoleはJDKのインストール場所\bin
フォルダの中にexeファイルがあるので、起動します。
もし、JDKにパスが通っている場合、コマンドプロンプトからjconosole
コマンドで起動することもできます。
監視の開始
ローカルプロセスの中には、現在起動中のプログラムの一覧が表示されるので、先ほど起動しておいたプログラムを選択して、接続ボタンを押します。
保護されていない接続の確認がされますが、ローカルに接続する分には問題ないのでそのまま接続。
接続後は概要タブが開き、時系列ごとの各情報を確認することができます。
監視内容
メモリー(ヒープ・メモリー使用率)
メモリータブではJVMのメモリ使用状況を確認することができます。
主に監視する必要があるのは、ヒープ・メモリー(オブジェクトを配置するメモリ領域。クラス情報などは含まない)の使用率です。
Survivor、Eden、Oldの3種類の各領域ごとの使用率を確認することもできます。
また、右上の「GCの実行」ボタンを押すことでGC(ガーベッジコレクション)を強制的に実行させることが可能。
上の画像でいきなりメモリ使用率が下がっているのはGCを実行したためです。
スレッド
スレッドがいくつ動いているか、各スレッド事の状況、デッドロックの検出などが可能。
今回のプログラムの場合、特にほかのスレッドを作成していないのでシングルスレッドですが、システムスレッドがほかにも動いているので、10個以上のスレッドが表示されています。
クラス
クラスでは、現在そのプログラムがロードしているクラスの数を表示します。
VMサマリー
VMサマリーでは、JVMの概要を見ることができます。
MBeans
MBeansタブでは、MBeansという機能を使い、プログラム内のオブジェクトの中身を参照、変更することが可能です。
MBeansServerにオブジェクトを登録することで、この画面から自作のオブジェクトを変更することが可能となります。
今回は特にMBeansに関しては設定していないので、システムオブジェクトのみが表示されています。
以上のように、jconsoleを使うことで簡単にプログラムの状態を監視することができます。