ヒープウォーカーで関心のあるオブジェクトを探す際、同じクラスのインスタンスが多すぎるオブジェクトセットに行き着くことがよくあります。特定の関心事項に応じてオブジェクトセットをさらに絞り込むために、プロパティや参照を選択基準に含めることができます。たとえば、特定の属性を含むHTTPセッションオブジェクトに関心がある場合などです。ヒープウォーカーのマージされた外部参照ビューでは、オブジェクトセット全体に対する参照チェーンを伴う選択ステップを実行できます。
しかし、個々のオブジェクトが表示される外部参照ビューでは、参照やプリミティブフィールドを制約する選択ステップを実行するための、はるかに強力な機能が提供されています。
外部参照ビューでトップレベルオブジェクト、プリミティブ値、または参照を選択すると、フィルターの適用→選択した値の制限アクションが有効になります。選択内容に応じて、フィルター値ダイアログには異なるオプションが提示されます。どのようなオプションを設定しても、新しいオブジェクトセット内のオブジェクトは、選択したものと同じ外部参照チェーンを持たなければならないという制約が常に暗黙的に追加されます。フィルターは常にトップレベルオブジェクトに対して作用し、現在のオブジェクトセットをより小さなセットへと絞り込みます。
プリミティブ値の制約は、HPROFとJProfilerのどちらのヒープスナップショットでも機能します。参照型については、非null値、null値、および選択したクラスの値をフィルターするようにJProfilerに指定できます。toString()メソッドの結果によるフィルタリングは、JProfilerが自身で判別できるjava.lang.Stringおよびjava.lang.Classオブジェクトを除き、ライブセッションでのみ利用可能です。
最も強力なフィルタータイプは、コードスニペットを使用するものです。オブジェクトをフィルターする方法には、根本的に異なる2つのアプローチがあります。
ライブセッションでは、JProfilerはプロファイルされたJVM内でフィルタリングスクリプトを実行し、実際のインスタンスをスクリプトに渡すことができます。ライブオブジェクトでスクリプトを実行してフィルターを適用によって表示されるスクリプトエディタでは、プロパティに直接アクセスする式やスクリプトを記述でき、そのbooleanの戻り値によって、インスタンスを現在のオブジェクトセットに保持するかどうかが決定されます。
JProfilerがライブオブジェクトにアクセスする必要があるため、当然ながらこの機能はライブセッションでのみ動作します。考慮すべきもう1つの要因は、ヒープスナップショットの取得後にオブジェクトがガベージコレクションされている可能性があることです。その場合、コードスニペットフィルターが実行された際に、そのようなオブジェクトは新しいオブジェクトセットに含まれません。
HPROFおよびPHDスナップショットを含むスナップショットでも機能する2つ目のオプションは、ダンプされたデータでスクリプトを実行してフィルターを適用アクションです。各インスタンスは、com.jprofiler.api.agent.heap.HeapObjectのインスタンスとしてスクリプトに渡されます。該当する場合、パラメータをダウンキャストできるサブインターフェースがいくつか存在します。詳細についてはJavadocを参照してください。たとえば、対象がオブジェクトインスタンスである場合はcom.jprofiler.api.agent.heap.Instanceインターフェースが利用可能で、フィールド値へのアクセスを提供します。スクリプトがトップレベルオブジェクトに対して動作し、現在のオブジェクトセット内のすべてのオブジェクトが同じ型である場合、スクリプトパラメータには自動的に適切なサブタイプが設定されます。
これらのフィルタースクリプトでは、HeapObjectパラメータのメソッドを通じて、すべての着信参照および外部参照にもアクセスできます。
PHDスナップショットにはフィールド情報が含まれていないため、このようなスナップショットではすべてのインスタンスがcom.jprofiler.api.agent.heap.HeapObjectまたはcom.jprofiler.api.agent.heap.ClassObjectとして渡され、フィールド値にはreferencedObjects()メソッドを通じてのみアクセスできることに注意してください。
フィルター以外にも、外部参照ビューには個々のオブジェクトとインタラクションするための機能が他に2つあります。toString() の値を表示アクションは、ビュー内に現在表示されているすべてのオブジェクトに対してtoString()メソッドを呼び出し、参照ノード内に直接表示します。ノードは非常に長くなることがあり、テキストが途切れる場合があります。コンテキストメニューからノードの詳細を表示アクションを使用すると、テキスト全体を確認できます。
toString()メソッドを呼び出すよりも、オブジェクトから情報を取得するさらに汎用的な方法は、文字列を返す任意のスクリプトを実行することです。トップレベルオブジェクトまたは参照が選択されている場合、toString()
の値を表示アクションの横にあるスクリプトを実行アクションを使用してこれを実行できます。スクリプト実行の結果は別のダイアログに表示されます。













