|
メモリ リーク検出のためのイベントのフローとユーザ インタフェースの基本的な機能がわかったら、次は Memory Leak Detector の実際の働きを確認する番です。この節では、インタフェースのさまざまなタブについて詳しく説明しながら、実際にメモリ リークのある Java アプリケーションのモニタで Memory Leak Detector がどのように働くのかを見ていくことにします。インタフェースの各タブについて、この節で詳細に説明します。
[Trend] タブ (図 3-1) でアプリケーションの分析を開始します。最も増大速度 (バイト数/秒) の大きいオブジェクト タイプが赤でマークされて [Trend Analysis - Which types are leaking?] テーブルの上部に表示されます。更新のたびに、このリストが変化して、最も増大速度の大きかったタイプがリストの下方に移動することがあります。図 3-1 のリストに表示されているオブジェクト タイプは、サンプル アプリケーションから取得されたものです。赤でマークされたオブジェクトにメモリ リークがあると推測できます。
表 3-1 は、[Trend] タブのテーブルの各列に表示される情報の説明をまとめたものです。
-Xmanagement
オプションを指定して JRockit アプリケーションを起動すると共に、Memory Leak Detector を JRockit に接続した状態にしておきます。
傾向分析は通常、自動的に開始されます。自動的に開始されない場合は、[Start] ボタンをクリックして、傾向分析を開始します。
アプリケーションでメモリ リークが発生している場合、傾向分析は図 3-1 のようになります。
[Types] タブが表示されます (図 3-2)。さらに詳しい調査の方法については、「メモリ リークのあるオブジェクトを詳しく見るには」を参照してください。
メモリ リークと疑われるもの (増大速度が大きくて、赤でマークされているタイプ) を見つけたら、それをさらに [Types] タブ(図 3-2) で調査します。そのためには、[Trend] タブでタイプを選択することによって調査を開始する必要があります (「調査を開始するには」を参照してください)。
[Types] タブには、調査対象のタイプを指しているすべてのタイプの間の関係が表示されます。タイプごとに数字も表示されます。これはそのタイプを指しているインスタンスの数です。
暗い赤は増大速度の大きいタイプを表しています (ただし、実際にメモリ リークに関係しているとは限りません)。
そのタイプが展開されて、さらに詳しい情報が表示されます (図 3-3)。
[Types] タブの [Instances] 部分が開きます。
選択したタイプのインスタンスがここにリストされます。表示されるインスタンスは、上のタイプ グラフで選択されたタイプからの矢印で示されているタイプへの参照を持っているものだけです。
インスタンスのリストがそれほど大きくなければ、タイプ B を指しているタイプ A のすべてのインスタンスがタブの下部に表示されます (図 3-5)。リストが大きすぎると、リストを表示しようとしたときに Memory Leak Detector がタイムアウトすることもあります。タイムアウトの設定は [File|Preferences] で変更することができます。
[Data kept alive (bytes)] 列には、それぞれのインスタンスが保持しているデータ量が表示されます。このデータは、ガベージ コレクションの対象にはなりません。
ウィンドウの [Overview] 部分を開くと、グラフ内での位置を確認することができます (この操作については、「グラフを鳥瞰するには」を参照してください)。表示内容を拡大/縮小したり中央に配置したりすることもできます (これらのツールの説明は、表 2-2 を参照してください)。
[Instances] タブが表示されます (図 3-6)。
[Instances] タブ (図 3-6) には、メモリ リークが疑われるタイプのインスタンスが表示されます。矢印を見れば、具体的なフィールドの名前もわかります。インスタンスを右クリックすると、[Inspect Instance] オプションのあるポップアップ メニューが表示されます。このオプションを選択すると、そのオブジェクトに含まれているすべてのインスタンス変数が表示されます。この情報はリークのあるオブジェクトがアプリケーション内のどこにあるのか特定するのに役立ちます。
表 3-2 で、[Instances] タブに表示できるものを説明します。
[Allocation Stack Traces] タブ (図 3-7) では、特定のタイプの割り当てがコード内のどこで行われたかを確認できます。割り当てスタック トレースを有効にすると、JRockit のパフォーマンスが低下することもあります。すべての割り当てポイントについての情報を収集するのには、ある程度の時間がかかります。
Memory Leak Detector は、さまざまな点をカスタマイズすることができます。図 3-8 から図 3-13 では、カスタマイズ可能な各種設定について説明します。
[Preferences] ウィンドウが開きます (図 3-8)。
Memory Leak Detector を閉じるときに確認メッセージが表示されるようにしたい場合は、[Confirm Exit] オプションを選択します。
表示したい Java ヒープの使用率をここで設定します。設定した使用率に満たないタイプは表示されません。すべてのタイプを表示したい場合は、この値を 0 (ゼロ) に設定します。
タイプの [List Instances] でリストしたいインスタンスの数をここで設定します。このリストは [Types] タブの [Instances] 部分に表示されます。
[Number of Array Elements to fetch] では、取得される配列要素の数を指定します。[List Largest Arrays] を選択してある場合に、これらの要素が [Types] タブに表示されます。