かなり大規模な Flex アプリケーションでメモリ リークを見つけようとしていますが、Flash Builder で利用できるわずかなツールを使用するのにうんざりしています。
具体的には、Flash Builder のツールがアクセスできると思われる同じ情報を使用して、メモリ内のオブジェクトの関係を分析したいと考えています。つまり、どのオブジェクトがメモリ内にあり、どのオブジェクトが参照を持っているか、それらへの参照を持っているかということです。その情報を考慮して、ノードがライブ オブジェクトであり、エッジが 1 つのオブジェクトから別のオブジェクトへの参照である有向グラフを作成したいと考えています。そこからdominatorsを検索したいと思います。これは、どのオブジェクトがリークしているかを示す良い指標となるはずです。
Eclipse は Java に対しても同様のことを行うと思います。
残念ながら、Flash Builder では、キャプチャしたプロファイリング データを、Flash Builder でのみ解析可能なバイナリ形式でのみエクスポートできます。出力をリバース エンジニアリングするのではなく、自分でデータをキャプチャすることにしました。プロファイリング API がflash.sampler.*パッケージで利用できるようになっているからです。
これまでのところ、現在メモリ内に存在するオブジェクトを収集し、それらの割り当てトレースを取得し、検査できるオブジェクトへの参照を取得することができました。これは、必要なもののほとんどです。しかし、FB プロファイラーが GC ルートへの後方参照をトレースする方法がわかりません。私が確認できる唯一の方法は、メモリ内のすべてのオブジェクトを検査し、各オブジェクトの各プロパティを検査することです。これを、「ルート」レベルとして分類されたオブジェクトへのチェーンが見つかるまで続けます。しかし、公開されているプロパティの参照しかたどることができないため、ガベージ コレクションを妨げる多くの参照を見逃す可能性は十分にあります。
Flash Builder プロファイラーはどのようにそれを行いますか?
私の疑いでは、情報を取得するために sampler.* API を使用するだけでなく、デバッガー接続を介して実行されるクエリでそれを補足します。これはおそらく私の作業の範囲外です。しかし、それを確認する方法がないので、サンプラー API だけを使用してそれが可能であることを願っています。