Actionscript 3を使用してByteArrayをアンロードする


90

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;
}

回答:


34

何も心配する必要はないと思います。場合はSystem.totalMemoryダウンし、あなたはリラックスすることができます。おそらく、新しく解放されたメモリを再利用しないOSである可能性があります(次回Flash Playerがより多くのメモリを要求するのを見越して)。

メモリを大量に消費する別の方法を試してみてください。FlashPlayerに割り当てられたメモリが減少し、代わりに他のプロセスに使用されることに気付くはずです。

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

Macを5分間使用した場合、3 GBのRAMの95%が使用され、その状態が維持されるため、システムが停止することはありません。これが、OSがメモリを処理する方法です。

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


24

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

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

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

ガベージコレクションを強制できますが、強制はできません。行う場合は、テストのためだけに行ってください。本番環境で行うと、パフォーマンスを低下させるだけでなく、パフォーマンスも低下します。

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

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

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


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();
}

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それに割り当てられていたメモリを解放できます。


15

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

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

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


10

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

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

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


9

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

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

また、実際にメモリリークがあるかどうかを示すことができるFlexBuilderのプロファイリングツールを使用することもできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.