JconsoleでVMの状態が知りたい
JDKに付属しているVMのプロファイラーにJconsoleというものがあります。
これはJDK1.5から付属するようになったのですが、これまで使用する機会がありませんでした。
環境変数JAVA_HOMEのbinの下にjconsole.exeはあります。
Intra-martではデバッグサーバという開発用PCで起動できるサーバがあるのですが、これを使用する場合は、
以下のようにローカルプロセスにデバッグサーバで起動したサーバのプロセスが表示されます。
しかし、サーバ(Intra-mart)がサービスで稼働している環境だと
のように表示されてしまいます。
はっきりしたことは言えないのですが、サービスで起動している場合はプロセスの所有者がSYSTEMになり
この状態ではローカルプロセスの一覧にでてこないようです。
そこで、リモートプロセスでつなぐために以下の設定を行います。
Intra-martのVM起動パラメータ(imart.xml)に以下の4つを追加して起動します。
ポートは好きな物をご指定ください。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=XXXX
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
接続ボタン押下後、以下のような画面になります。
ちなみに、上は以下のようなVMパラメータでIntra-martを稼働し、5分くらい経過したあとのグラフです。
5分間は誰もアクセスしていません。
-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m
-Djava.awt.headless=true
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7900
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
さて、Eden,Survivor,Tenureの割合はどうなっているかと言うと
Eden | Survivor | Tenure |
---|---|---|
279,616kb | 34,944kb | 699,072kb |
となっています。
SurvivorRatioは今回のようにVMパラメータに何も指定しないと8になるようでした。
今度はパラメータを変更してしばらく放置し、グラフを見てみます。
すると以下のような割合になります。
-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m
-XX:NewSize=320m -XX:MaxNewSize=320m
-XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=80
-Djava.awt.headless=true
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7900
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Eden | Survivor | Tenure |
---|---|---|
163,840kb | 81,920kb | 720,896kb |
ヒープメモリのトータルは変わらないのですが、Eden、Survivor、Tenureの使用量の変遷が
かなり違ってくるのが分かります。いつもこの設定が正解ということがないのが難しいですね。