6

オブジェクトを継続的に作成および破棄するかなり大きな Flex & Papervision3D アプリケーションがあります。また、SWF リソース ファイルもロードおよびアンロードします。SWF を実行している間、プレーヤーが鳴ると約 2GB までゆっくりとメモリを消費します。明らかに、GC がその仕事をしてくれることを期待して、不要になったインスタンスへの参照を手放したと確信しています。しかし、私は問題がどこにあるのかを理解するのにかなりの時間を費やしています.

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

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

4

4 に答える 4

4

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

于 2009-03-20T07:21:57.030 に答える
3

FlexBuilderでFlexProfilerを使用する方法を説明する何かに出くわしましたが、メモリリークのデバッグに非常に役立ちました。私は間違いなくそれを試してみることをお勧めします。とても使いやすいです。アプリケーションのプロファイリング時に見つけたもの:

値オブジェクトのプロパティとしてコレクション(少なくともLARGEコレクション)を使用することは避けてください。ArrayCollectionCairngormアプリケーションにはいくつかのタイプの値オブジェクトクラスがあり、それぞれに、フィルタリングに使用される「children」プロパティがありました。プロファイリング時に、これらが私の最大のメモリイーターの1つであることがわかったので、代わりに「parentId」をとして保存し、intこれをフィルタリングに使用するようにアプリケーションを変更しました。使用したメモリが大幅に削減されました。このようなもの:

古い方法:

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
}

また、イベントリスナーが不要になったら削除することをお勧めします。

于 2009-03-20T13:31:42.960 に答える
3

このような問題のため、私はオープン ソース ライブラリを開発しました。このライブラリは、実行中のすべてのイベントを常に監視するのに役立ちます。実装は非常に簡単で、プロジェクトを 10 ~ 15 分でリファクタリングし、開発した EventController を使用するように変換しました。

基本的にあなたのシナリオでは、すべてのイベントを実行し、それらを次のように置き換えます: obj.addEventListener(...);

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

あとは同じで、イベントを登録して、EC.log();

すべての詳細とドキュメントは私のサイトにあります。良いフィードバックや悪いフィードバックがありましたら、お気軽に投稿してください。調査いたします。

サイトは: http://fla.as/ec/

于 2010-03-18T19:28:24.437 に答える
2

メモリ リークが指数関数的に増加する場合は、GC が機能していない可能性があります。コードを見て、オブジェクトの参照カウントを減らすことができる場所を確認してください (それらを に設定することによってnull)。イベント ハンドラを弱くします。そして再プロファイリング。

于 2009-03-20T06:18:51.207 に答える