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のマロニエ・オ・ショコラや,ラ・プレシューズの和栗のモンブランなど,おいしい栗のお菓子がいろいろ。 その中でも櫻庭がお勧めなのはピエール・エルメのマカロン マロン エ テベール マッチャ 。マロンのマカロンに,抹茶のクリーム。そして,クリームの中にはマロングラッセが入っています。抹茶とマロングラッセという組み合わせは絶妙です。 と,今日もまた体重を気にしつつ,プログラミングしています。 |