96

ByteArrayActionScript 3 を使用してメモリから強制的にアンロードするにはどうすればよいですか?

私は次のことを試しました:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
4

8 に答える 8

34

あなたが心配することは何もないと思います。System.totalMemory下がればリラックスできます。新しく解放されたメモリを再利用しないのは、OS である可能性が非常に高いです (次に Flash Player が追加のメモリを要求することを見越して)。

非常にメモリを集中的に使用する別のことを試してみると、Flash Player に割り当てられたメモリが減少し、代わりに他のプロセスに使用されることに気付くはずです。

私が理解しているように、最新の OS でのメモリ管理は、各プロセスに割り当てられた量、または割り当てられた合計量を見るという観点からは直感的ではありません。

Mac を 5 分間使用すると、3 GB RAM の 95% が使用され、その状態が維持され、ダウンすることはありません。これは、OS がメモリを処理する方法です。

他の場所で必要とされない限り、終了したプロセスでもメモリが割り当てられたままになります (たとえば、次回の起動が速くなる可能性があります)。

于 2008-08-14T17:05:34.857 に答える
24

(私はこれについて肯定的ではありませんが...)

AS3 は非決定論的なガベージ コレクションを使用します。これは、ランタイムが必要と判断したときにいつでも参照解除されたメモリが解放されることを意味します (実行するのにコストのかかる操作であるため、実行する理由がない限り、通常はそうではありません)。これは、ほとんどの最新のガベージ コレクション言語 (C# や Java など) で使用されているのと同じアプローチです。

byteArrayが指すメモリまたは配列自体内の項目への参照が他にないと仮定すると、byteArrayが宣言されているスコープを終了した後、メモリはある時点で解放されます。

ガベージ コレクションを強制することはできますが、実際にはすべきではありません。行う場合は、テスト目的でのみ行ってください。本番環境で行うと、パフォーマンスが向上するどころか、パフォーマンスが大幅に低下します。

GC を強制するには、(はい、2 回) 試してください。

flash.system.System.gc();
flash.system.System.gc();

詳しくはこちらをご覧ください

于 2008-08-01T13:08:59.487 に答える
19

この記事を見てください

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA actionscript プログラマーですが、ガベージコレクターが必要なときに実行されない可能性があるため、私が感じているのはそれです。

したがって http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

コレクションコードを試してみて、それが役立つかどうかを確認することをお勧めします

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}
于 2008-08-01T13:08:59.127 に答える
15

あなたはあなた自身の質問に答えたと思います。

System.totalMemory割り当てられていない、「使用されている」メモリの合計量を示します。アプリケーションが使用しているのは20MBのみである可能性があることは正確ですが、将来の割り当てに使用できる5MBがあります。

Adobeのドキュメントがメモリの管理方法に光を当てるかどうかはわかりません。

于 2008-08-01T14:03:22.230 に答える
15

残念ながら、 Flash/actionscriptでのメモリ管理に関しては、できることはあまり多くありません。ActionScript は使いやすいように設計されています (そのため、人々がメモリ管理について心配する必要はありませんでした)。

ByteArray以下は回避策です。変数を作成する代わりに、これを試してください。

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

は の動的byteArrayプロパティでありbyteObject、割り当てられたメモリを解放できます。

于 2008-08-01T13:14:40.007 に答える
11

したがって、MySQLからたとえば20MBをロードすると、タスクマネージャーでアプリケーションのRAMが約25MB増加します。次に、接続を閉じてByteArrayを破棄しようとすると、RAMが解放されることはありません。ただし、System.totalMemoryを使用すると、Flash Playerはメモリが解放されていることを示しますが、そうではありません。

Flash PlayerはJavaのようなことをしていて、ヒープスペースを予約し、アプリが終了するまでそれを解放しませんか?

数え切れないほどのブログ投稿から、AVM2のGCは楽観的であり、独自の不思議な方法で機能することを読んだかもしれませんが、そうです。したがって、Javaのように機能し、ヒープスペースを予約しようとします。ただし、十分な時間をかけて、かなりのメモリを消費する他の操作を開始すると、以前のスペースが解放されます。これは、プロファイラーを使用して一晩で確認でき、アプリ上でいくつかのテストが実行されます。

于 2008-09-17T10:09:52.217 に答える
10

したがって、MySQL からたとえば 20MB をロードすると、タスク マネージャーでアプリケーションの RAM が約 25MB 増加します。次に、接続を閉じて ByteArray を破棄しようとすると、RAM が解放されません。ただし、System.totalMemory を使用すると、フラッシュ プレーヤーはメモリが解放されていることを示しますが、そうではありません。

プレイヤーはメモリを「解放」しています。ウィンドウを最小化して元に戻すと、メモリが System.totalMemory の表示にかなり近づいていることがわかります。

また、実際にメモリ リークが発生しているかどうかを示すことができる FlexBuilder のプロファイリング ツールの使用にも関心があるかもしれません。

于 2008-10-06T18:16:34.417 に答える