J2SE 5.0からJava SEでもソフトウエアの管理機能が導入されました。JMXとMXBeanが目玉であることには変わらないのですが,そのほかにも次に示すツール群が提供されています。

  • jps
  • jstat
  • jinfo
  • imap
  • jstack

ところが,J2SE 5.0ではjpsとjstat以外の三つのツールはWindowsでは提供されませんでした。それが,Java SE 6になって,ようやくWindowsでも使えるようになったのです。Windows以外のプラットフォームをお使いの方には旧聞に属すると思いますが,簡単に説明していきましょう。

jinfo

jinfoはJava VMの構成情報を参照,もしくは設定するためのツールです。

HotSpot VMには-XX:ではじまる起動オプションがあることはご存じでしょうか。例えば,GCの情報を出力するための-XX:+PrintGCなどがあります。詳しくはHotSpot VMオプションのWebページを参照してください。

jinfoを使うと,これらの起動オプションの値を参照したり,あとから設定することができます。

例えば,先ほどの-XX:+PrintGCを例にとってみましょう。jinfoなどのツールはすべてプロセスIDを指定する必要があります。プロセスIDはjpsツールで調べることができます。

C:\temp>jps
2676 OutOfMemorySample2
3904 Jps
 
C:\temp>jinfo -flag PrintGC 2676
-XX:-PrintGC

C:\temp>jinfo -flag +PrintGC 2676

C:\temp>jinfo -flag PrintGC 2676
-XX:+PrintGC

はじめのjpsでプロセスIDが2676だということがわかります。単にオプションの値がどうなっているかを調べるには-flagのあとにオプションの名称を指定します。ここでは,出力が-XX:-PrintGCになっています。PrintGCの前に"-"がついているので,GCの情報は出力されていないことがわかります。

それではこのオプションの設定を変更してみましょう。そのためには,オプションの前に+もしくは-を付加します。-flag +PrintGCとすることで,-XX:+PrintGCと設定したことになります。

こうすれば,ターゲットになるアプリケーション(この場合はOutOfMemorySample2)が,-XX:+PrintGCを起動オプションに指定したのと同じ出力をすることを確認できるはずです。

ところで,jinfoは使えるようになったものの,まだWindowsは差別を受けています。jinfoには-syspropsというオプションがあり,システムプロパティの一覧を表示できます。しかし,依然としてWindowsでは使えません。

jmap

jmapはヒープ・ダンプを取得するために使用するツールです。取得したヒープ・ダンプはgdbなどで読み込むことができます。

C:\temp>jps
2316 OutOfMemorySample2
2508 Jps
 
C:\temp>jmap -dump:file=heap.map 2316
Heap dump file created

-dump:file=[ファイル名]でヒープ・ダンプのファイル名を指定します。

ヒープ・ダンプ以外に,インスタンスのヒストグラムを出力することもできます。

C:\temp>jmap -histo 2316
num   #instances    #bytes  class name
--------------------------------------
  1:       318     2694104  [Ljava.lang.Object;
  2:       859      146784  [C
  3:       779      116104  <symbolKlass>
  4:        35       65928  [B
  5:       723       23136  java.util.TreeMap$Entry
  6:       139       22176  <constMethodKlass>
  7:       862       20688  java.lang.String
  8:        25       12832  <constantPoolKlass>
  9:       139       12256  <methodKlass>
 10:        32       10240  <objArrayKlassKlass>
 11:        25        9072  <instanceKlassKlass>
 12:        66        6336  java.lang.Class
 13:       175        5624  [Ljava.lang.String;
 14:        25        4704  <constantPoolCacheKlass>
     ... (以下,略) ...

jstack

jstackはスレッド・ダンプを出力するためのツールです。スレッド・ダンプとは,稼働しているすべてのスレッドのスタック・トレースのことです。

通常,スレッド・ダンプは,Windowsであればjavaが動作しているコマンドプロンプトからCtrl+Breakキーを押すことで取得できます(Unix系のOSではkill -QUIT [pid])。これをツールで行えるようにしたのがjstackです。

C:\temp>jps
2316 OutOfMemorySample2
2508 Jps
 
C:\temp>jstack 2316
2006-09-28 05:01:18
Full thread dump Java HotSpot(TM) Client VM (1.6.0-beta2-b86 mixed mode, sharing
):
 
"Low Memory Detector" daemon prio=6 tid=0x02b1ec00 nid=0x260 runnable [0x0000000
0..0x00000000]
   java.lang.Thread.State: RUNNABLE
 
"CompilerThread0" daemon prio=10 tid=0x02b1c800 nid=0xf34 waiting on condition [
0x00000000..0x02d7f91c]
   java.lang.Thread.State: RUNNABLE
 
"Attach Listener" daemon prio=10 tid=0x02b1b400 nid=0xa14 waiting on condition [
0x00000000..0x02d2fea8]
   java.lang.Thread.State: RUNNABLE
 
"Signal Dispatcher" daemon prio=10 tid=0x02b1a400 nid=0xa7c runnable [0x00000000
..0x00000000]
   java.lang.Thread.State: RUNNABLE
 
"Finalizer" daemon prio=8 tid=0x02abdc00 nid=0xe4c in Object.wait() [0x02c8f000.
.0x02c8fa94]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x22ecc0a0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
        - locked <0x22ecc0a0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
 
     ... (以下,略) ...

jstackを使用すれば,デッドロックなどで動作が止まってしまった場合でも,どこで止まっているかを調べることができます。

このようなツールを有効に活用できれば,ソフトウエアの管理を効率化することが可能です。ぜひ,活用してみてください。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

秋ですねぇ。秋といえばやっぱり栗。洋栗もいいですが,和栗もおいしい。ナポリの栗を使ったSadaharu AOKIのマロニエ・オ・ショコラや,ラ・プレシューズの和栗のモンブランなど,おいしい栗のお菓子がいろいろ。

その中でも櫻庭がお勧めなのはピエール・エルメのマカロン マロン エ テベール マッチャ 。マロンのマカロンに,抹茶のクリーム。そして,クリームの中にはマロングラッセが入っています。抹茶とマロングラッセという組み合わせは絶妙です。

と,今日もまた体重を気にしつつ,プログラミングしています。