Actionscript 3 を使用した ByteArray のアンロード
-
08-06-2019 - |
質問
強制的にアンロードするにはどうすればよいですか ByteArray
ActionScript 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;
}
正しい解決策はありません
他のヒント
何も心配する必要はないと思います。もし System.totalMemory
下がってリラックスできます。新しく解放されたメモリを再利用しないのは、OS である可能性が非常に高いです (次回 Flash Player がより多くのメモリを要求することを見越して)。
メモリを大量に消費する別のことを実行してみると、Flash Player に割り当てられたメモリが減少し、代わりに他のプロセスに使用されることに気づくと思います。
私が理解しているように、最新の OS のメモリ管理は、各プロセスに割り当てられた量、さらには割り当てられた合計量を見るという観点から見ても直感的ではありません。
Mac を 5 分間使用すると、3 GB RAM の 95% が使用され、その状態が維持され、ダウンすることはありません。それが OS がメモリを処理する方法です。
他の場所で必要がない限り、終了したプロセスにもメモリが割り当てられたままです (これにより、次回の起動が速くなります)。
(私はこれについては肯定的ではありませんが...)
AS3 は非決定的なガベージ コレクションを使用します。つまり、ランタイムが必要に応じて、参照されていないメモリが解放されます (実行にはコストがかかる操作であるため、実行する理由がない限り、通常は解放されません)。これは、最新のガベージ コレクション言語 (C# や Java など) で使用されているのと同じアプローチです。
が指すメモリへの参照が他にないと仮定します。 byteArray
または配列自体内の項目の場合、メモリはスコープを終了した後のある時点で解放されます。 byteArray
と宣言されています。
ガベージ コレクションを強制的に実行することはできますが、実際にはそうすべきではありません。やるなら、テストのためだけにやってください...実稼働環境でこれを実行すると、パフォーマンスが向上するどころか、パフォーマンスに悪影響を及ぼします。
GC を強制するには、次のことを (はい、2 回) 試してください。
flash.system.System.gc();
flash.system.System.gc();
この記事を見てください
http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html
IANA アクションスクリプト プログラマーですが、私が感じているのは、ガベージ コレクターが必要なときに実行されない可能性があるためです。
したがって、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();
}
あなた自身の質問に答えたと思います...
System.totalMemory
割り当てられていない、「使用」されているメモリの合計量がわかります。アプリケーションが使用しているのは 20 MB だけであることは正確ですが、将来の割り当てに使用できる 5 MB が空きます。
Adobe のドキュメントがメモリの管理方法を明らかにするかどうかはわかりません...
残念なことに、メモリ管理に関しては、 フラッシュ/アクションスクリプト あなたにできることはあまりありません。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
, に割り当てられているメモリを解放できます。
したがって、MySQL からたとえば 20MB をロードすると、タスク マネージャーでアプリケーションの RAM が約 25MB 増加します。次に、接続を閉じて ByteArray を破棄しようとすると、RAM が解放されません。ただし、System.totalMemory を使用すると、フラッシュ プレーヤーはメモリが解放されていると表示しますが、実際はそうではありません。
Flash プレーヤーは Java のようなことをしてヒープ領域を予約し、アプリが終了するまで解放しないのでしょうか?
はい、いいえ、数え切れないほどのブログ投稿からお読みになったかもしれませんが、AVM2 の GC は楽観的であり、独自の不思議な方法で機能します。そのため、Java と少し似た動作をし、ヒープ領域を予約しようとしますが、十分な時間をかけて、大量のメモリを消費する他の操作を開始すると、以前の領域が解放されます。これは、プロファイラーを使用して、アプリ上でいくつかのテストを一晩実行することで確認できます。
したがって、MySQL からたとえば 20MB をロードすると、タスク マネージャーでアプリケーションの RAM が約 25MB 増加します。次に、接続を閉じて ByteArray を破棄しようとすると、RAM が解放されません。ただし、System.totalMemory を使用すると、フラッシュ プレーヤーはメモリが解放されていると表示しますが、実際はそうではありません。
プレイヤーは記憶を「解放」しています。ウィンドウを最小化して元に戻すと、メモリが System.totalMemory で示されているものにかなり近づいていることがわかります。
実際にメモリ リークがあるかどうかを確認できる FlexBuilder のプロファイリング ツールの使用にも興味があるかもしれません。