2009-07-20 8 views
2

私はAIR/Flexアプリケーションを作成しましたが、いくつかの人がテストをしていて、しばらく実行したままにしておけば、すべてのマシンが非常に遅くなります。最初はうまく動くので、これはどこかのメモリリークでなければなりません。私はこれでプロファイラを使いましたが、大量のメモリを使用していることを示す唯一のことは、MethodQueueElementです。これは私が書いたクラスではなく、私はそれが何であるかわからない、私はFlexフレームワークの一部を想定しています。私はプロファイラを使用することに慣れていないので、私が見ているものが何であるか分かりません。それは "メモリ"が高く、唯一のクラスであり、100,000を超えるインスタンスがあると言いました。これが私の問題ならば、私はそれを修正するために何ができますか?私はこのクラスが何をしているのか、それがどのようにインスタンス化されるかについては知らない。プロファイラでメモリリークを検出する方法は?

おかげ

+0

どのバージョンフレックスフレームワーク(またはフレックスSDK、特定のフレームワークでコンパイルしないとき)を使用していますか? – Janosch

答えて

2

MethodQueueElementクラスはmx.core.UIComponentコンポーネントクラスの内部クラスです。 これは、callLater呼び出しによってエンキューされたメソッド呼び出しで表現するために使用されます。 callLaterメソッドは、UIComponentのパブリックインターフェイスの一部であるため、コード内で呼び出すか、フレームワークによって呼び出されます(例:UIComponent.setFocusのように)。

すべてのMethodQueueElementインスタンスを解放するには、 UIComponentは、現在のMethodQueueElementsの配列を新しい(空の)配列に置き換えます。 (callLaterDispatcher2メソッド内で)callLaterDispatcher2が呼び出されないようにするために、メモリリークを防ぐには唯一の方法です。

これをデバッグするには、callLater(ここではインスタンスが作成されるので、何とかいつも呼び出され、スタックトレースはここを参照してください)のメソッドでブレークポイントを設定することができます(callLaterDispatcher2 (私はそれが呼び出されないと思います)、UIComponentGlobals.callLaterSuspendCountが!= 0であるかどうかをチェックします。これはcallLaterDispatcher2が呼び出されない理由です。

後者は大文字にする必要があり、私はあなたがトゥイーンまたは何か他のものがUIComponent.suspendBackgroundProcessingを呼び出すが、その後(にresumeBackgroundProcessingがたとえばを呼び出す到達する前に、コードを終了例外のため)にresumeBackgroundProcessingを呼び出していないことを、疑う

関連する問題