0

複数のモジュールを使用する巨大なフレックス アプリケーションがあります。モジュールのロードとアンロードを長時間使用すると、大きなメモリ リークの問題が発生します。

すべての検索とさまざまな記事に基づいて、アンロード時にオブジェクトをクリーンアップし、イベント リスナーを削除し、タイマーを停止し、参照を破棄する必要があることを理解しています。

これは、モジュールの 1 つで一度に 1 つのコンポーネントをピックアップすることから始めました。

これがどのように構成されているかです。

複数のビューを持つモジュールをロードする 1 つの親アプリケーションがあります。コンポーネントは mxml で定義され、ビュー スタックの mxml モジュールで参照されます。

この mxml コンポーネントは、イベント リスナーが追加された VBox です。

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
         paddingTop="10"
         paddingLeft="10"
         paddingBottom="10"
         paddingRight="10"
         creationComplete="onInit()"
         show="onShow()"
         resize="onResize(event)" ....

mxml には、親コンテナーからバインドされたプロパティがいくつかあります。上記のリスナー以外にも、外部からアクセスされるプライベート変数があります -

[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance(); 

モジュールのアンロード時に、このコンポーネントで次のように破棄関数を呼び出します-

public function dispose():void
{
    this.removeEventListener(FlexEvent.CREATION_COMPLETE,onInit);
    this.removeEventListener(FlexEvent.SHOW,onShow);
    this.removeEventListener(ResizeEvent.RESIZE,onResize);

    var arr:Array = this.getChildren();
    for(var i:int = 0; i<arr.length;i++)
        delete arr[i];
    this.removeAllChildren();

    _model = null;

    //Properties that are binded from the parent container
    Property1 = null;
    Property2 = null;               

    this.deleteReferenceOnParentDocument(this.parentDocument as IFlexDisplayObject);

}

プロファイラーを実行してモジュールを切り替えると、このコンポーネントのインスタンスの数は増え続けています。プロファイラーで GC Collect をクリックしましたが、インスタンスはそのままです。

モジュールmxmlである親コンテナで、モジュールのアンロード時に次の行も書いてみました-

//function call to invoke dispose as above
component1.dispose();
component1 = null;

助けてください。ここで何が欠けているのか、あるいはこれが正しいアプローチなのかさえわかりません。

ありがとう。

4

3 に答える 3

1

これで問題が解決するわけではありませんが、お役に立てば幸いです。

  1. 何よりもまず、コードを調べてリファクタリングするだけでは何も得られません。リークがあることを証明するハードコア データが必要です。これにより、何がリークしているのかがわかるため、それを修正できます。私が使用したすべてのメモリ プロファイラの中で、FlashBuilder は依然として最高であり、IntelliJ は 1 年信頼できず、Adobe Scout はパフォーマンス分析のみを行います。

  2. 最小のモジュールから始めて、メモリ プロファイラーを開いた状態で、モジュールを開閉すると (できればメイン リグから分離して) リークが発生することを証明します。その場合は、モジュールからすべてのコードを削除することから始めて、もう一度テストし、部分ごとに追加して、最終的にリードに導きます。最初にイベントリスナーなどに対処する最適な容疑者検索を使用できます。

  3. Thomas Sugden によるこの記事は、フレックス メモリのプロファイリングについて私が読んだ中で今でも最高のものです。

  4. リークがあるかどうかを評価するプロセスを自動化することさえ知っている、モジュールをテストできるツールを作成するのは時間の価値があります。これは重要です。なぜなら、あなたのせいではないリークが時々あるからです。Flex フレームワークには、避けられないリークがたくさんあります。

これが役に立ったことを願っています。

于 2013-09-11T18:36:09.760 に答える