Java向けの性能解析ツールへのニーズが高まっている。JavaVMのメモリー消費量やクラスの実行時間から,メモリー・リークの発生個所などを突き止める機能を備える。目的に合ったツールを使えば,数値をベースにしたチューニングが可能となる。

 Java性能解析ツールへのニーズが高まってきた。2002年末に「DevPartner Java Edition」を出荷した日本コンピュウェアは,「画面などを日本語化してからとも思ったが,顧客の引き合いが強く,英語版を先行投入した」(マーケティング本部 プロダクトマーケティング 主任 菅原観慈氏)。

 背景には,Javaによるシステム構築が一般化し,かつシビアな性能が求められてきたことがある。Javaに限らず,サーバー増設で性能向上を図るケースは多い。しかし,「ハードウエアは安いが,ソフトウエアのライセンスがかさむ。増設の前にチューニングすべき点は山ほどある」(グレープシティ Java事業部 部長代理 小野耕宏氏)。

 なかでも,プログラムのチューニングは徹底したい。メモリー・リークを引き起こすプログラムが1本あるだけで,システム全体の性能が劣化してしまう。なぜ性能の悪いプログラムを書いてしまうのか――ボーランドの藤井等氏(営業本部 マーケティング部 部長)は「“こう書いてはいけない”と知っていても,まさか自分のコードに含まれているとは思わない」ことを理由の一つに挙げる。

 Java性能解析ツールは,JavaVMのメモリーの利用状況やクラスの実行時間などから,“性能の悪さ”を数値で指摘する。DBなどを含めたトランザクションに着目し,システムのボトルネックを検出する製品もある。

 ただし,ツールは「3回手を叩いて拝めば答えが出てくるようなものではない」(日揮情報ソフトウェア Preciseソリューション・サービス部 シニア・コンサルタント 田中博実氏)。ツールを用いた調査手法を身につけることが大切だ。“メモリー・リークをどう検出するのか”といった具体例から,性能解析ツールの実力を探った。

対象はプログラムかシステム

 解析ツールは2種類に分けられる(図1[拡大表示])。一つは,実行時間やリソース消費の観点からソース・コードの妥当性を検証する製品。主に単体テストから結合テストで用いる。もう一つは,Javaに注目しながら,システム全体のボトルネックを検出する製品。結合テスト以降で用いる。ここでは,前者を「プログラム解析ツール」,後者を「システム解析ツール」と呼ぶ。

 プログラム解析ツールは,JavaVMのプロファイラ・インタフェース(JVMPI*)から情報収集する製品が多い(表1[拡大表示])。JVMPIでは,ヒープ割り当てやスレッドの開始といったイベントが取得できる。ツールは情報を蓄積し,解析の切り口を付けてGUI上に表示。開発者は,ドリル・ダウンで問題のあるプログラムを特定していく。

図1●ニーズに合ったJava性能解析ツールを選ぶ
解析ツールは2種類ある。性能の悪いプログラムを特定するための「プログラム解析ツール」,システムのボトルネックを検出するための「システム解析ツール」である。利用目的が異なるため,まずはニーズを明らかにしたい
 
表1●主なJava性能解析ツール

 モニタリング対象は主に,(1)JavaVMのメモリーの利用状況,(2)クラスやメソッドの実行時間,(3)スレッドの利用状況,である。Borland Optimizeit SuiteやJProbe Suiteは,これら3つをまとめて提供。米Rational Softwareは,(1)をPurify,(2)をQuantifyと別製品化している。

メモリー・リークを突き止める

 プログラム解析ツールで把握できるのは,主にパフォーマンス,およびマルチスレッドに起因する問題である。パフォーマンスの問題では,まずメモリー・リークを引き起こすクラスやメソッドを特定する必要がある。

図2●メモリー・リークの発生を突き止める
プログラム実行前後で,ヒープ領域の差分に注目することがポイント。オブジェクトの個数が大幅に増加している場合は,オブジェクト参照が解放されていない可能性が高い。Borland Optimizeit Suiteを使った調査の手順

 そのために,JavaVMのメモリーの利用状況をモニタリングする機能を使い,ヒープ領域の推移に注目する。図2[拡大表示]に,Borland Optimizeit Suiteを使った調査例を示した。図中に赤い線で囲んだオブジェクトでメモリー・リークが起きている。オブジェクト参照が残っていることが原因と推測されるため,ツールが示したクラスの相関図から,このオブジェクトを参照しているクラスを特定し,修正を検討することになる。「性能の問題を改善するコストは,本番稼働に近づくほど高くなる」(グレープシティの小野氏)。このような問題は,可能な限り単体テスト時につぶしておきたい*1

 ツールの利用に当たっては,モニタリングのオーバーヘッドに注意が必要だ。ツールがどのフェーズまで使えるかは,負荷テスト時でもモニタリングできるかなど,オーバーヘッドに寄るところが大きい*2。どの程度と見るかは,利用環境に依存するため,一概には言えない。ただし,「モニタリング対象の数で負荷は大きく変わるため,絞り込みが欠かせない」と,ベンダーは口をそろえる。APサーバーやフレームワークのライブラリはモニタリング対象外にするなど,可能な限りユーザー・プログラムのみに絞りたい*3

 通常,プログラム解析ツールを使ったチューニング作業は,問題を発見→ソース・コードを修正→検証,というサイクルで行う。解析ツールが開発ツールと連携できれば,効率的に作業が進む。Borland Optimizeit Suiteは開発ツール「JBuilder」との連携が可能。米IBMの開発ツール「WebSphere Studio V5」は,JVMPIベースのプログラム解析ツールを含んでいる。「Jinsight*を改良してApplication Developer版以降に加えた。単体から結合テスト時に使われる」(日本アイ・ビー・エム ソフトウェア事業部 WebSphere事業推進 インダストリー営業部 主任 IT スペシャリスト 串宮平恭氏)*4

(森山 徹=tmoriyam@nikkeibp.co.jp)