0

かなり大規模な Flex アプリケーションでメモリ リークを見つけようとしていますが、Flash Builder で利用できるわずかなツールを使用するのにうんざりしています。

具体的には、Flash Builder のツールがアクセスできると思われる同じ情報を使用して、メモリ内のオブジェクトの関係を分析したいと考えています。つまり、どのオブジェクトがメモリ内にあり、どのオブジェクトが参照を持っているか、それらへの参照を持っているかということです。その情報を考慮して、ノードがライブ オブジェクトであり、エッジが 1 つのオブジェクトから別のオブジェクトへの参照である有向グラフを作成したいと考えています。そこからdominatorsを検索したいと思います。これは、どのオブジェクトがリークしているかを示す良い指標となるはずです。

Eclipse は Java に対しても同様のことを行うと思います。

残念ながら、Flash Builder では、キャプチャしたプロファイリング データを、Flash Builder でのみ解析可能なバイナリ形式でのみエクスポートできます。出力をリバース エンジニアリングするのではなく、自分でデータをキャプチャすることにしました。プロファイリング API がflash.sampler.*パッケージで利用できるようになっているからです。

これまでのところ、現在メモリ内に存在するオブジェクトを収集し、それらの割り当てトレースを取得し、検査できるオブジェクトへの参照を取得することができました。これは、必要なもののほとんどです。しかし、FB プロファイラーが GC ルートへの後方参照をトレースする方法がわかりません。私が確認できる唯一の方法は、メモリ内のすべてのオブジェクトを検査し、各オブジェクトの各プロパティを検査することです。これを、「ルート」レベルとして分類されたオブジェクトへのチェーンが見つかるまで続けます。しかし、公開されているプロパティの参照しかたどることができないため、ガベージ コレクションを妨げる多くの参照を見逃す可能性は十分にあります。

Flash Builder プロファイラーはどのようにそれを行いますか?

私の疑いでは、情報を取得するために sampler.* API を使用するだけでなく、デバッガー接続を介して実行されるクエリでそれを補足します。これはおそらく私の作業の範囲外です。しかし、それを確認する方法がないので、サンプラー API だけを使用してそれが可能であることを願っています。

4

1 に答える 1

1

実際、私見では、Flash (Flex) Builder のメモリ/パフォーマンス ツールがわずかなものであれば、それを正しく使用していません。利用可能なツールを理解するための鍵は、4.0 SDK から利用可能であり、「runtime-analysis-guy」として割り当てられたすべてのプロジェクトでそれを使用してきました。

ライブ ビュー:
これについては誰もが知っています。現在利用可能なものを「ライブ」ビューで表示します。現在のインスタンス数は有用ですが、さらに有用なのは累積です。これは、あまりにも多くのオブジェクトを作成する誤ったメソッドを追跡するのに役立ちます。

徘徊オブジェクト ビュー:
おそらくこれを使用していないでしょうが、一度使用すると元には戻らないと信じてください。これにより、小さな画面/アプリケーションの状態を明確に定義するのに役立ちます (例: 1. 開始点、2. ダイアログを作成する機能、3. 1 と同じ状態である終了点)。アプリケーションで、テストする場所に移動します。次に、メモリ スナップショット機能 - 「色付きの線のアイコン」をクリックします。アプリケーションで、手順 2 と 3 を実行します。プロファイラーに戻り、これをもう一度クリックします。ここで、アプリケーションを終了または一時停止できます。両方のメモリ プロファイルを選択し、loitering オブジェクト関数 (緑色のアイコン) をクリックします。理論的には、このリストは空になりますが、そうではありません。これにより、[スイープ] のマークが付いているが [リープ] のマークが付いていないオブジェクトが表示されます。

任意のオブジェクトを D-クリックすると、このオブジェクトにまだ保持されているすべての参照のリストを含む詳細ビューが表示されます。アプリケーションで分解プロセスを作成していない場合 (IDestroyable インターフェイスなど) は、すぐに停止して戻ってこれを行ってください。複雑なプリミティブではないすべてのオブジェクトに null を割り当てる必要があります。これは、すべてのクラス、すべての配列、ベクター、イベントリスナーなどを意味します。

私が知る限り、ツールが使用するのはサンプラー パッケージだけです。結局のところ、ツールは呼び出し時にアプリケーションにコードを挿入しません。これは、すべてのオブジェクトを NewObjectSample および DeletedObjectSample と比較し、getSavedThis() を参照してプロトタイプ チェーンをさかのぼります (これにより、getSavedThis() を呼び出すことができるオブジェクトが返されるはずです)。

http://help.adobe.com/en_US/flashbuilder/using/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7edf.html

お役に立てれば。

于 2012-04-18T01:58:06.663 に答える