簡単にJavaアプリケーションの情報を見る方法

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Javaで作ったプログラムはJVM(Java Virtual Machine)で動作します。
Javaはメモリ管理などの細かい部分をプログラマではなく、JVMが請け負っています。
そのため、プログラマはいろいろな制約をあまり気にすることなくプログラミングが可能、という利点があるのですが、大規模なプログラムでは動作状態が気になるもの。
それを監視するための仕様としてJMX(Java Management Extensions)というものがあります。
JVMに組み込まれているJMXに、APIを通じてアクセスすることでJVMの情報を閲覧することができます。
親切な事に、JDKには監視情報をグラフィカルに表示するためのツールであるjconsoleが同梱されています。
今回は、jconsoleを使ってJavaアプリケーションの情報の監視をするまでを書いていきます。

jconsoleでの監視

監視対象のプログラムを作成

まずは、監視対象となるプログラムを作成します。
jconsoleでは、動作中のプログラムに対して監視を行うため、すぐに終了しないプログラムが必要です。
今回は単純に1秒ごとに文字列を出力するプログラムを作ります。

Main.java
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コマンドで起動することもできます。

起動すると接続の画面が開きます。
image

監視の開始

ローカルプロセスの中には、現在起動中のプログラムの一覧が表示されるので、先ほど起動しておいたプログラムを選択して、接続ボタンを押します。

保護されていない接続の確認がされますが、ローカルに接続する分には問題ないのでそのまま接続。
image

接続後は概要タブが開き、時系列ごとの各情報を確認することができます。
image

監視内容

メモリー(ヒープ・メモリー使用率)

image

メモリータブではJVMのメモリ使用状況を確認することができます。
主に監視する必要があるのは、ヒープ・メモリー(オブジェクトを配置するメモリ領域。クラス情報などは含まない)の使用率です。
Survivor、Eden、Oldの3種類の各領域ごとの使用率を確認することもできます。

また、右上の「GCの実行」ボタンを押すことでGC(ガーベッジコレクション)を強制的に実行させることが可能。
上の画像でいきなりメモリ使用率が下がっているのはGCを実行したためです。

スレッド

image

スレッドがいくつ動いているか、各スレッド事の状況、デッドロックの検出などが可能。
今回のプログラムの場合、特にほかのスレッドを作成していないのでシングルスレッドですが、システムスレッドがほかにも動いているので、10個以上のスレッドが表示されています。

クラス

image

クラスでは、現在そのプログラムがロードしているクラスの数を表示します。

VMサマリー

image

VMサマリーでは、JVMの概要を見ることができます。

MBeans

image

MBeansタブでは、MBeansという機能を使い、プログラム内のオブジェクトの中身を参照、変更することが可能です。
MBeansServerにオブジェクトを登録することで、この画面から自作のオブジェクトを変更することが可能となります。
今回は特にMBeansに関しては設定していないので、システムオブジェクトのみが表示されています。

以上のように、jconsoleを使うことで簡単にプログラムの状態を監視することができます。