製品版 Java デバッグツール
Purify メモ

最終更新日:2004/06/07
gomi521@oki.com

製品版 Java デバッグツール Purify

Purify は汎用のメモリリークチェックやメモリフットプリント、関数プロファイリングなどの機能を持つ製品です。

その中でメモリフットプリントの計測・チューニングツールとして Java や .NET 対応もしています。 ここでは Java に特化した Purify の使用方法を紹介します。

また機能の一部は Quantify を含んでいます。名称も PurifyPlus となっています。

目次

インストール

インストールは製品パッケージに含まれている CD-ROM から行ないます。他の Rational スィート製品の中に含まれていますので、他の製品と同時にインストールする場合もあります。

インストールが終了しましたら、他の Rational 製品と同様なライセンスサーバの設定を行ないます。

起動

WindowsXP で Purify を起動しますと「キーボードレイアウトを変更します」のダイアログウィンドウが出ますので、「OK」を押します。

次にデフォルトの設定では、以下の「ようこそ」画面が表示されます。

最初にプログラムを計測するときは、「実行」ボタンをクリックします。

設定

「実行」ボタンをクリックすると、以下の実行設定用の画面が表示されます。

「エラーとリークデータ」、「カバレッジ、エラー、リークデータ」は JavaVM の内部情報に対応していませんので、Java のときは「メモリ、プロファイリングデータ」をチェックしてのメモリフットプリントの計測になります。

 

Java オブジェクトの参照グラフの設定

Java オブジェクトの参照グラフ(ヒープメモリの参照状態のスナップショット)を取得するための設定を行ないます。

上記の画面の「設定」ボタンをクリックします。クリックしますと以下の画面が表示されます。

「オブジェクトの設定」の「オブジェクト参照グラフデータの生成」をチェックします。

これでオブジェクト参照グラフが生成されるようになります。

 

収集パッケージの設定

デフォルトの設定では、すべてのクラス・メソッドを表示するようになっています。収集(表示)後にフィルタを掛けて収集データの表示を制御することができますが、クラス単位で設定するようになっています。そこでクラスが大量にある javax.* などが不要であるときは予め収集しないようにして設定しておきます。

この方法は上記の画面で「構成」ボタンをクリックしますと以下の画面が表示されますので、ここで設定します。

例えば、java.*, javax.* sun.* などのシステムのクラスを収集しないときは、これらのパッケージのボタンをチェックします。

今まで述べてきましたすべての設定は Purify が記憶しますので、次回からは同じ設定で動作することになります。同じ設定のときはこれらの設定は不要となります。また設定は保存することもできます。

後は「OK」ボタンをクリックしてこの画面を閉じます。次に最初の実行設定画面に戻って「実行」ボタンを押すと、計測対象のプログラムが実行され、計測が始まります。

今回は「jp.co.okisoft.esc.funadoLisp.Lisp」を設定していますので、この Java プログラムを計測することになります。

実行、計測

メモリフットプリントの表示

「実行」ボタンをクリックしますと、Java プログラムが実行がされ、同時にメモリフットプリントの計測が始まります。

以下に開始直後の画面を示します。

右下の緑色の部分が使用中のメモリフットプリントを表しています。上記では2回 GC が起動して 使用メモリが減少してることが分かります。GC の箇所は赤色の小さな円が表示されています。(この画面は50%程度縮小していますので見にくくなっています。)

なお、右上のドットはスレッドの活動を表現しています。緑色が活動中であることを示しています。

 

Purify の計測データのスナップショット

任意の時点で Purify が計測収集しているデータを保存する「スナップショット」ができます。

計測データのスナップショットを取るためには、上部にある「カメラ」のアイコンをクリックします。クリックすると、その時点の計測データが保存されます。以下の図の右下部分はカメラのアイコンと縦線で示された2回のスナップショットを示しています。

各スナップショットでは、関数の caller-callee 呼び出し元・呼び出し先のコールグラフやオブジェクトの参照グラフ、関数のプロファイリングなどが計測データとして保持されています。 この中のデータでコールグラフや関数プロファイリングのデータは、Quantify で計測するデータと同じものになります。

 

関数コールグラフ

上記のスナップショットで取得したデータの中で、関数呼び出しのグラフを表示します。

これを表示するには、左側のスナップショットのどれかをダブルクリックします。右側のペーンに複数のタブ付きの画面が表示されます。このタブの「コールグラフ」のタブをクリックしますと以下のグラフが表示されます。

ズーム、表示部分の位置の変更などの操作ができます。また太い線で示される強調表示を何にするかなどの設定ができます。デフォルトの設計ではルートからの最短パスを表示しています。呼び出し回数の多いものなどに変更することができますので、チューニングするときに直感的に議論するときなどはこれを指定するといいでしょう。

このコールグラフはオートレイアウトされていますが、重なって見にくいので、手動でノード(関数)のレイアウトを変更しています。

フィルタ

フィルタを掛けて,上記のコールグラフの一部を省略することができます。上部にある「フィルタマネージャ」のアイコンを クリックすると全クラスの一覧が出ますので、表示されないようにするクラスやメソッドをチェックします。

クラス数が多いときは、起動直後の設定の「構成」で収集データそのものを制御します。参照

関数リスト表示

コールグラフの同様にスナップショットの「関数リスト」のタブをクリックしますと以下の関数リストが表示されます。

メソッドの呼び出し回数や割り当てられているメソッドのバイト数、オブジェクト数、クラス、ソースが表示されます。

これを使用して、例えば、呼び出し回数の多いものや使用メモリの多いメソッドを順に表示させることができます。

フィルタ

関数コールのときと同様に、フィルタを掛けることができます。方法も全く同じで上部にある「フィルタマネージャ」の アイコンをクリックすると全クラスの一覧が出ますので、フィルタして表示されないようにするクラスやメソッドをチェックします。

 

関数の詳細

関数リスト表示で関数名の箇所をダブルクリックしますと関数の詳細な情報が表示されます。

呼び出し回数、バイト数、上位関数の呼び出し回数、下位関数の呼び出し回数などの詳細が表示されます。

 

スナップショット(ラン)の差分

スナップショットの差分を表示することができます。スナップショットの画面で「ランの比較」アイコンをクリックすることにより、現在のスナップショット(ラン)と任意のスナップショット(ラン)を比較することができます。

上記の図では割り当ての変更があったコールが強調表示されています。「関数リストの表示」タブをクリックすることで関数呼び出しの回数の差分の一覧が表示されています。またその中から任意の関数をダブルクリックしますと関数単位の差分が表示されます。

 

オブジェクトリスト表示

「オブジェクトリスト表示」のタブをクリックすると以下のリストが表示されます。

このリストには、「オブジェクト名」、「メソッド名」、「サイズ」、「O+Rサイズ(参照先も含めたオブジェクトのサイズ)」、 「ガーベッジ収集不可回数」、「行番号」、「ルート種類」があります。

これにより、サイズ順に表示させて、メモリフットプリントのパフォーマンスチューニングを行なうことができます。 また、このスナップショット時に本来は死んでいてガベージになっているべきオブジェクト(生きていてはいけないオブジェクト)を発見することにより、メモリリークの発見ができます。

 

オブジェクト参照グラフ

オブジェクトリスト表示の画面で、任意のオブジェクトをダブルクリックすると、そのオブジェクトに関連した参照関係がグラフ表示されます。 これを以下に示します。

関数コールのときと同様にフィルタをかけることにより、グラフの簡略化が行なえます。

上記のグラフは複雑な箇所を例として表示していますが、実務的にはもっと簡略化して調査します。

 

メモリリークの発見方法 by Purify

  1. メモリリークの有無の確認(犯罪の確認
    メモリフットプリントを表示して、メモリリークの存在を確認します
  2. リーク地点の絞込みとスナップショットの収集(犯行現場の特定と証拠集め
    リークの地点を絞り込み、数箇所でスナップショットを取ります
  3. 直接のリークオブジェクトの追跡(犯人の追跡
    スナップショットでオブジェクトリスト表示し、オブジェクトの個数をチェックします
  4. リークオブジェクトの捕縛(実行犯の逮捕
    3 よりリークしているオブジェクトを発見します
  5. リークオブジェクトの参照の追跡(真犯人の追跡
    リークしているオブジェクトの参照を参照グラフから見つけます
  6. 参照の追跡と修正(真犯人の逮捕と矯正
    正しくない参照を見つけ、参照部分のプログラムを見つけ、修正します

パフォーマンスチューニング方法 by Purify

不正待ち状態の解消

  1. 待ち状態の有無の確認
    スレッドの活動状況を表示して、待ち状態の有無を確認します
  2. 不正待ち状態の解消
    待つべきでない場所で待ち状態になっている不正な待ち状態を見つけ、修正します

ボトルネックの解消

  1. ボトルネック関数の発見
    関数リストを実行時間で表示させて、ボトルネックの可能性が高い関数を見つけます
  2. ボトルネック関数のチューニング
    チューニングして、再度計測を行ない、効果を確認します

関連サイト

PurifyPlus, Purify, Quantify は IBM の登録商標または商標です。
IBMは、IBM Corporationの登録商標です。

資料室へ戻る

Copyright (c) 2003,2004 OKI Software Co., Ltd.