Entladen eines ByteArray- Actionscript 3

stimmen
72

Wie entladen ich mit Nachdruck einen ByteArrayaus dem Speicher mit Actionscript 3?

Ich habe folgendes versucht:

// 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;
}
Veröffentlicht am 01/08/2008 um 13:30
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
29

Ich glaube nicht , dass Sie nichts zu befürchten. Wenn System.totalMemorygeht können Sie sich entspannen. Es kann sehr gut das Betriebssystem sein , das nicht den neu freigegebenen Speicher (in Erwartung der nächsten Flash Player für mehr Speicher wird fragen) nicht zurückzufordern.

Versuchen Sie, etwas anderes zu tun, die sehr speicherintensiv ist und ich bin sicher, dass Sie werden feststellen, dass der Speicher auf Flash Player zugewiesen wird abnehmen und stattdessen für den anderen Prozess verwendet werden.

So wie ich es verstanden habe, ist in der modernen Betriebssystemen Speicherverwaltung nicht intuitiv aus der Sicht auf den zu jedem Prozess zugeordnet Mengen suchen, oder sogar die gesamten zugeteilten Menge.

Als ich meinen Mac für 5 Minuten 95% meiner 3 GB RAM verwendet wird, verwendet haben, und es wird auch so bleiben, es geht nie nach unten. Das ist nur die Art und Weise des O Speicher verarbeitet.

Solange es nicht an anderer Stelle sogar Prozesse benötigt, die noch Speicher zugewiesen verlassen haben (dies kann sie das nächste Mal machen startet schneller, zum Beispiel).

Beantwortet am 14/08/2008 um 18:05
quelle vom benutzer

stimmen
19

(Ich bin nicht positiv darüber, aber ...)

AS3 verwendet eine nicht-deterministische Garbage Collection. Was bedeutet, dass nicht referenzierte Speicher freigegeben werden, wenn die Laufzeit wie es sich anfühlt, (in der Regel nicht, es sei denn es einen Grund ist zu laufen, da es eine teure Operation ist auszuführen). Dies ist der gleiche Ansatz von den meisten modernen Müll gesammelt Sprachen verwendet (wie C # und Java als auch).

Angenommen , es werden keine weiteren Hinweise auf den Speicher , auf den byteArrayoder die Elemente innerhalb des Arrays selbst, wird der Speicher irgendwann befreit werden , nachdem Sie den Bereich verlassen , wo byteArrayerklärt wird.

Sie können eine Garbage Collection erzwingen, wenn Sie wirklich nicht sollten. Wenn Sie das tun, tun Sie es nur zum Testen ... wenn man es in der Produktion zu tun, werden Sie Performance schaden viel mehr als es hilft.

Um einen GC zu erzwingen, versuchen Sie (ja, zweimal):

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

Sie können hier mehr lesen .

Beantwortet am 01/08/2008 um 14:08
quelle vom benutzer

stimmen
15

Werfen Sie einen Blick auf diesen Artikel

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

IANA Actionscript-Programmierer, aber das Gefühl, ich bin immer ist, dass, da die Garbage Collector möglicherweise nicht ausgeführt, wenn Sie es wollen.

daher http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Also würde ich empfehlen, ihre Sammlung Code ausprobieren und sehen, ob es hilft

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();
}
Beantwortet am 01/08/2008 um 14:08
quelle vom benutzer

stimmen
13

Ich glaube, Sie haben Ihre eigene Frage beantwortet ...

System.totalMemorygibt Ihnen die Gesamtspeichermenge „verwendet“ wird, nicht zugeordnet. Es ist richtig, dass die Anwendung nur 20mb Verwendung sein kann, aber es hat 5mb, die für zukünftige Zuweisungen frei ist.

Ich bin mir nicht sicher, ob die Adobe docs Licht auf die Art und Weise vergossen würde, dass es Speicher verwaltet ...

Beantwortet am 01/08/2008 um 15:03
quelle vom benutzer

stimmen
13

Leider , wenn es um die Speicherverwaltung kommt in Flash / Actionscript gibt es nicht viel Sie tun können. Actionscript wurde entwickelt , zu verwenden , um einfach (so wollten sie die Leute nicht über die Speicherverwaltung sorgen haben)

Im Folgenden ist eine Abhilfe, statt der Schaffung einer ByteArrayVariable versuchen dies.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Wo byteArrayeine dynamische Eigenschaft ist byteObject, können Sie den Speicher frei, der für sie reserviert wurde.

Beantwortet am 01/08/2008 um 14:14
quelle vom benutzer

stimmen
9

Also, wenn ich 20 MB laden sagen von MySQL, im Task-Manager die RAM für die Anwendung geht von etwa 25 MB auf. Dann, wenn ich die Verbindung schließen und versuchen, die ByteArray zu entsorgen, befreit das RAM nie auf. Allerdings, wenn ich System.totalMemory verwenden, Flash Player zeigt, dass der Speicher freigegeben wird, was nicht der Fall ist.

Ist der Flash Player so etwas wie Java tun und Heap-Speicher zu reservieren und Freigabe erst die App beendet wird?

Nun ja und nein, wie man es von unzähligen Blogeinträgen gelesen haben könnte die GC in AVM2 ist optimistisch und wird seine eigene mysteriöse Weise arbeiten. So macht es ein bisschen wie Java arbeiten und versucht Heap-Speicher zu reservieren, aber wenn Sie es lange genug lassen und tun andere Operationen beginnen, die einige bedeutende Speicher verbrauchen wird es, dass die vorherigen Speicherplatz frei. Sie können sehen, den Profiler über Nacht unter Verwendung von mit einigen Tests auf Ihrer Anwendung ausgeführt wird.

Beantwortet am 17/09/2008 um 11:09
quelle vom benutzer

stimmen
7

Also, wenn ich 20 MB laden sagen von MySQL, im Task-Manager die RAM für die Anwendung geht von etwa 25 MB auf. Dann, wenn ich die Verbindung schließen und versuchen, die ByteArray zu entsorgen, befreit das RAM nie auf. Allerdings, wenn ich System.totalMemory verwenden, Flash Player zeigt, dass der Speicher freigegeben wird, was nicht der Fall ist.

Der Spieler wird als „Freigeben“, um den Speicher. Wenn Sie das Fenster minimieren und wiederherstellen, sollten Sie sehen, dass der memeory jetzt viel näher an, was System.totalMemory zeigt.

Vielleicht haben Sie auch mit Flexbuilder des Profilierwerkzeuge interessiert sein, die Ihnen zeigen können, wenn Sie wirklich Speicherlecks haben.

Beantwortet am 06/10/2008 um 19:16
quelle vom benutzer


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more