0

フレックス配列コレクションが大量のデータ (たとえば 2,00,000 個の新しい参照オブジェクト) で処理される場合、フレックス クライアント ブラウザーのメモリは 20MB 増加します。この余分な 20MB は、オブジェクトで定義された変数とは無関係です。詳細な例を以下に示します。

var list:ArrayCollection =  new  ArrayCollection;
for(var i:int = 0;i<200000;i++)
{
    var obj:Object = new Object;
    list.add(obj);

}

上記のコードを実行すると、フレックス クライアント ブラウザのメモリが 20MB 増加しました。別のシナリオとして、アクション スクリプト オブジェクトを配列コレクションに追加してみました。アクション スクリプト オブジェクトを以下に定義します。

public class Sample
{
    public var id:int;
    public var age:int;
    public Sample()
    {
    }

}

200000 Sample クラスを配列コレクションに追加すると、まだ 20MB のメモリ リークがありました。

var list:ArrayCollection =  new  ArrayCollection;
for(var i:int = 0;i<200000;i++)
{
    var obj:Sample = new Sample;
    obj.id= i;
    onj.age = 20;
    list.add(obj);

}

サンプル オブジェクトをフレックス arrayList と配列に追加しようとしましたが、問題は解決しません。この余分なメモリがフレックスによって消費される場所について誰かが説明できますか?

4

2 に答える 2

1

OS へのメモリの要求には時間がかかるため、Flash Player は、それらの要求の数を最小限に抑えるために、(実際に必要とするよりも多くの) 大量のメモリを要求します。

于 2013-02-24T12:54:46.650 に答える
0

OS の割り当て時間がもはや大したことであるかどうかはわかりません。平均 1.5 ~ 2 GHz の CPU について話しているのです。モバイルであってもです。しかし、ベノワは正しい道を進んでいます。主にヒープの断片化を回避するために、一度に大きなチャンクが予約されます。一度に必要なサイズのチャンクのみでメモリが要求された場合、他の IO 要求とともに、システム メモリは非常に急速に断片化されます。これらのフラグメントが OS 空間に返されると、メモリ マネージャーが同じサイズ以下の要求を取得しない限り、このチャンクを再割り当てできず、可視プールに失われます。したがって、この問題を回避するには、フラッシュ (およびメモリ マネージャー) が一度に 16Mb を要求します。

あなたの場合、1 つのオブジェクトを作成したか、100,000 を作成したかは問題ではありません。最小 16Mb のプライベート メモリ (タスク マネージャーに表示されるもの) から開始します。

Flash Player の割り当てメカニズムは、Mozilla MMgc に基づいています。
ここでそれについて読むことができます: https://developer.mozilla.org/en-US/docs/MMgc

于 2013-02-24T20:11:28.800 に答える