2009-03-20 15 views
6

私は非常に大きなFlexを持っています。&オブジェクトを連続的に作成して破棄するPapervision3Dアプリケーション。また、SWFリソースファイルもロードおよびアンロードされます。それが実行されている間、SWFがゆっくりとメモリを消費します。明らかに、私は、GCがその仕事をすると期待していないインスタンスへの参照を取りやめさせることはかなり確信しています。しかし、私は、問題がどこにあるのか把握する時間がある。FLEX/AS3メモリリークのデバッグ

私は、プロファイラーとメモリスナップショットのキャプチャなどのオプションを使用しようとしましたが、私の問題は避けています。私はそこにもデバッグのFlash Playerを使用して既知の問題があると思いますか?しかし、私はリリース版を使っても喜びは得られません。

FLEX/AS3を使用してメモリリークの問題を追跡するにはどうすればよいですか?消費を見つけるために使用した戦略、テクニック、ツールはどれですか?

答えて

3

は、私は、Flex BuilderでのFlexプロファイラの使用方法を説明する何かを偶然見つけ、それがデバッグに私には大きな助けでしたメモリリーク。私は間違いなくそれを試してみるだろう。それは非常に使いやすいです。

値オブジェクトのプロパティとしてコレクション(少なくともLARGEコレクション以上)を使用しないようにしてください。私はCairngormアプリケーションにいくつかのタイプのバリューオブジェクトクラスを用意していましたが、いずれもArrayCollectionという「子」プロパティを持ち、フィルタリングに使用されていました。プロファイリングするとき、私はこれらが私の最大の記憶嫌い者の1人であることを発見したので、代わりにintとして "parentId"を保存し、これをフィルタリングに使用するようにアプリケーションを変更しました。使用されたメモリは大幅に削減されました。このような何か:

古い方法:

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner2 Objects 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner3 Objects 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
} 

新しい方法:必要がなくなったとき、私はまた、イベントリスナーを削除勧めないだろう

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner1 Object 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner2 Object 
} 

2

メモリリークが指数関数的に増加すると、GCが失敗する可能性があります。コードを見て、オブジェクトの参照カウントを減らすことができるところを参照してください(nullに設定してください)。イベントハンドラを弱くする。そして、再プロフィール。

4

私は通常、(ASにはデストラクタがないので)私が作るすべてのクラスでクリーンアップメソッドを実装します。私がGCで気づいた主な問題は、イベントリスナーです。 dirkgentlyと述べたことに加えて、明示的に削除することはできないので、匿名リスナー機能を避けてみてください。ここでは、役に立つかもしれないいくつかのリンクです:

+0

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/arguments.html#callee – Jotham

3

このような問題のため、私はいつでもあなたのすべてのイベントを監視するのに役立つオープンソースライブラリを開発しました。実際に実装するのが簡単で、10分から15分でプロジェクトを再絞り込みして、私が開発したEventControllerを使用するように変換しました。

基本的にすべてのイベントを実行して置き換えます。 obj.addEventListener(...);

to: EC.add(obj、...);

残りは、イベントを登録して、EC.log()を使用して任意の時点ですべてのイベントを簡単に見ることができます。

すべての詳細とドキュメントは私のサイトにあります。これがあなたに役立つかどうか、そして作業を開始するのがわかります。あなたが良いか悪いかのフィードバックがあれば投稿してください。私はそれを調べます!

サイトは次のとおりです。 http://fla.as/ec/

関連する問題