Javaのパフォーマンスを監視する

GUIが使えるときは、JDK6 update 7から付属しているjvisualvmというツールを使ってJavaプログラムのパフォーマンス調査を行うことが出きるが、GUIが使えない環境にいるときは、jps, jstatコマンドを組み合わせて使って同様の結果を得ることが出来る。(これは最近まで知らなかった。id:unrockoさんに教えてもらったw)

jps
Unixのpsコマンド見たいなもの。プロセスIDの代わりにvmidを取得する
jstat
UnixのTopコマンドみたいなも。

まず、システム上でどんなJavaプログラムが起動しているかをjpsコマンドで調べる。一番簡単なのはそのままjpsコマンドを実行する。

$ jps
28815 Jps
27493 
27434 Main

vmidと簡単な説明が表示される。もう少し詳しい結果を得たい場合は・・・

$ jps -lv

起動オプション等も一緒に表示されるので、どのプログラムがどのvmidに対応するか分かると思う。
次に、jpsコマンドで得たvmidを元にjstatコマンドを実行する。以下その例を示す。

$ jstat -gcutil 27493 1000 5
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  48.84  60.20  60.94  99.70    311    2.742    10    6.106    8.849
  0.00  48.84  62.26  60.94  99.70    311    2.742    10    6.106    8.849
  0.00  48.84  64.32  60.94  99.70    311    2.742    10    6.106    8.849
  0.00  48.84  68.61  60.94  99.70    311    2.742    10    6.106    8.849
  0.00  48.84  70.71  60.94  99.70    311    2.742    10    6.106    8.849

上記コマンドの意味は以下のとおり。

jstat -<オプション> vmid 更新間隔(ミリ秒) 表示回数

オプションには以下の物が指定出来る。(ここからコピペ:Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle)

class クラスローダの動作に関する統計データ
compiler HotSpot Just-in-Time コンパイラの動作に関する統計データ
gc ガベージコレクトされたヒープの動作に関する統計データ
gccapacity 世代ごとの容量と対応する領域に関する統計データ
gccause ガベージコレクション統計データの概要 (-gcutil と同じ) と、直前および現在 (適用可能な場合) のガベージコレクションイベントの原因
gcnew New 世代の動作に関する統計データ
gcnewcapacity New 世代のサイズと対応する領域に関する統計データ
gcold Old 世代および Permanent 世代の動作に関する統計データ
gcoldcapacity Old 世代のサイズに関する統計データ
gcpermcapacity Permanent 世代のサイズに関する統計データ
gcutil ガベージコレクション統計データの概要
printcompilation HotSpot コンパイル方法の統計データ

結構いろいろな項目について調査出来る。ちなみに、各オプションで表示される列は変わってくる。詳細は以下のサイトに。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

また、別のオプション「-h3」をつけることでヘッダ行を3行ごとにつけることが出来るので、表示回数を200とかに指定した場合でも各列の意味を見失わないですむ。

$ jstat -gcutil -h3 27493 1000 200
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  51.34  91.91  61.30  99.70    323    2.924    10    6.106    9.030
  0.00  51.34  94.93  61.30  99.70    323    2.924    10    6.106    9.030
  0.00  51.34  97.87  61.30  99.70    323    2.924    10    6.106    9.030
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  51.34 100.00  61.30  99.70    323    2.924    10    6.106    9.030
 49.36   0.00   3.40  61.33  99.70    324    2.938    10    6.106    9.045
 49.36   0.00   5.07  61.33  99.70    324    2.938    10    6.106    9.045
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 49.36   0.00   8.42  61.33  99.70    324    2.938    10    6.106    9.045
 49.36   0.00  11.86  61.33  99.70    324    2.938    10    6.106    9.045
 49.36   0.00  13.58  61.33  99.70    324    2.938    10    6.106    9.045

jps, jstatコマンドの使いかたは分かったので、次は、その内容をどう読み解くかについて調べたいと思う。(いつ)