Frage

Wie entlade ich gewaltsam eine ByteArray aus 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;
}

Keine korrekte Lösung

Andere Tipps

Ich glaube nicht, dass du dir Sorgen machen musst.Wenn System.totalMemory geht runter, du kannst dich entspannen.Es kann durchaus sein, dass das Betriebssystem den neu freigegebenen Speicher nicht zurückgewinnt (in Erwartung, dass Flash Player das nächste Mal mehr Speicher anfordern wird).

Versuchen Sie, etwas anderes zu tun, das sehr speicherintensiv ist, und Sie werden sicher feststellen, dass der dem Flash Player zugewiesene Speicher abnimmt und stattdessen für den anderen Prozess verwendet wird.

So wie ich es verstanden habe, ist die Speicherverwaltung in modernen Betriebssystemen nicht intuitiv, wenn man die jedem Prozess zugewiesenen Mengen oder sogar die insgesamt zugewiesene Menge betrachtet.

Wenn ich meinen Mac 5 Minuten lang benutzt habe, sind 95 % meiner 3 GB RAM belegt, und das bleibt auch so, es geht nie aus.Das ist einfach die Art und Weise, wie das Betriebssystem mit dem Speicher umgeht.

Solange es nicht an anderer Stelle benötigt wird, ist auch Prozessen, die beendet wurden, noch Speicher zugewiesen (dies kann zum Beispiel dazu führen, dass sie beim nächsten Mal schneller starten).

(Ich bin diesbezüglich nicht positiv gestimmt, aber...)

AS3 verwendet eine nicht deterministische Garbage Collection.Das bedeutet, dass nicht referenzierter Speicher freigegeben wird, wann immer es der Laufzeit gefällt (normalerweise nicht, es sei denn, es gibt einen Grund für die Ausführung, da die Ausführung eine kostspielige Operation ist).Dies ist derselbe Ansatz, der von den meisten modernen Garbage-Collected-Sprachen (wie auch C# und Java) verwendet wird.

Vorausgesetzt, es gibt keine weiteren Verweise auf den Speicher, auf den verwiesen wird byteArray oder die Elemente innerhalb des Arrays selbst, der Speicher wird irgendwann nach dem Verlassen des Bereichs freigegeben byteArray wird deklariert.

Sie können eine Speicherbereinigung erzwingen, sollten dies aber nicht tun.Wenn Sie dies tun, tun Sie dies nur zum Testen ...Wenn Sie dies in der Produktion tun, wird die Leistung viel mehr beeinträchtigt als verbessert.

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

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

Mehr können Sie hier lesen.

Schauen Sie sich diesen Artikel an

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

IANA-Actionscript-Programmierer, aber ich habe das Gefühl, dass der Garbage Collector möglicherweise nicht ausgeführt wird, wenn Sie es möchten.

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

Daher würde ich empfehlen, den Sammlungscode auszuprobieren und zu sehen, ob er 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();
}

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

System.totalMemory gibt Ihnen die Gesamtmenge des Speichers an, der „genutzt“ und nicht zugewiesen wird.Es ist richtig, dass Ihre Anwendung möglicherweise nur 20 MB belegt, aber 5 MB für zukünftige Zuweisungen frei sind.

Ich bin mir nicht sicher, ob die Adobe-Dokumente Aufschluss darüber geben würden, wie der Speicher verwaltet wird ...

Leider, wenn es um die Speicherverwaltung geht Flash/Actionscript Da kann man nicht viel machen.ActionScript wurde so konzipiert, dass es einfach zu verwenden ist (so dass sich die Benutzer keine Gedanken über die Speicherverwaltung machen müssen).

Das Folgende ist eine Problemumgehung, anstatt eine zu erstellen ByteArray Variable versuchen Sie dies.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Wo byteArray ist eine dynamische Eigenschaft von byteObject, können Sie den dafür zugewiesenen Speicher freigeben.

Wenn ich also beispielsweise 20 MB von MySQL lade, erhöht sich im Task-Manager der RAM für die Anwendung um etwa 25 MB.Wenn ich dann die Verbindung schließe und versuche, das ByteArray zu entsorgen, wird der RAM nie freigegeben.Wenn ich jedoch System.totalMemory verwende, zeigt der Flash Player an, dass der Speicher freigegeben wird, was nicht der Fall ist.

Führt der Flash-Player so etwas wie Java aus, reserviert Heap-Speicherplatz und gibt ihn erst frei, wenn die App beendet wird?

Nun ja und nein, wie Sie vielleicht aus unzähligen Blogbeiträgen gelesen haben, ist der GC in AVM2 optimistisch und wird auf seine eigene, mysteriöse Weise funktionieren.Es funktioniert also ein bisschen wie Java und versucht, Heap-Speicherplatz zu reservieren. Wenn Sie es jedoch lange genug warten lassen und andere Vorgänge ausführen, die erheblichen Speicher verbrauchen, wird der vorherige Speicherplatz freigegeben.Sie können dies mithilfe des Profilers über Nacht beobachten, indem einige Tests über Ihrer App ausgeführt werden.

Wenn ich also beispielsweise 20 MB von MySQL lade, erhöht sich im Task-Manager der RAM für die Anwendung um etwa 25 MB.Wenn ich dann die Verbindung schließe und versuche, das ByteArray zu entsorgen, wird der RAM nie freigegeben.Wenn ich jedoch System.totalMemory verwende, zeigt der Flash Player an, dass der Speicher freigegeben wird, was nicht der Fall ist.

Der Spieler „gibt“ die Erinnerung frei.Wenn Sie das Fenster minimieren und wiederherstellen, sollten Sie feststellen, dass der Speicher jetzt viel näher an dem liegt, was System.totalMemory anzeigt.

Möglicherweise sind Sie auch daran interessiert, die Profilierungstools von FlexBuilder zu verwenden, die Ihnen zeigen können, ob tatsächlich Speicherlecks vorliegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top