arrays - Entladen eines ByteArray mit Actionscript 3

Translate

Wie entlade ich aByteArrayaus 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;
}
This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich glaube nicht, dass Sie sich Sorgen machen müssen. WennSystem.totalMemorygeht runter du kannst dich entspannen. Es kann durchaus sein, dass das Betriebssystem den neu freigegebenen Speicher nicht zurückfordert (in Erwartung des nächsten Mal, wenn Flash Player mehr Speicher anfordert).

Versuchen Sie etwas anderes, das sehr speicherintensiv ist, und ich bin sicher, dass Sie feststellen werden, dass der 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 Beträge oder sogar den zugewiesenen Gesamtbetrag betrachtet.

Wenn ich meinen Mac 5 Minuten lang benutzt habe, werden 95% meines 3 GB RAM verwendet, und das bleibt so, es geht nie aus. So geht das Betriebssystem mit dem Speicher um.

Solange es nicht anderweitig benötigt wird, wird auch Prozessen, die beendet wurden, noch Speicher zugewiesen (dies kann beispielsweise dazu führen, dass sie beim nächsten Mal schneller gestartet werden).

Quelle
Translate

(Ich bin mir nicht sicher, aber ...)

AS3 verwendet eine nicht deterministische Speicherbereinigung. Dies bedeutet, dass nicht referenzierter Speicher freigegeben wird, wenn sich die Laufzeit danach anfühlt (normalerweise nicht, es sei denn, es gibt einen Grund für die Ausführung, da die Ausführung eine teure Operation ist). Dies ist der gleiche Ansatz, der von den meisten modernen, von Müll gesammelten Sprachen verwendet wird (wie auch C # und Java).

Angenommen, es gibt keine anderen Verweise auf den Speicher, auf den von verwiesen wirdbyteArrayoder die Elemente innerhalb des Arrays selbst, der Speicher wird irgendwann freigegeben, nachdem Sie den Bereich verlassen haben, in dembyteArraywird deklariert.

Sie können eine Speicherbereinigung erzwingen, obwohl Sie dies wirklich nicht sollten. Wenn Sie dies tun, tun Sie dies nur zum Testen. Wenn Sie dies in der Produktion tun, beeinträchtigen Sie die Leistung viel mehr als nur.

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

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

Hier können Sie mehr lesen.

Quelle
Jax
Translate

Schauen Sie sich diesen Artikel an

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

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

Daherhttp://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 prüfen, 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();
}
Quelle
Translate

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

System.totalMemorygibt Ihnen die Gesamtmenge des Speichers an, der "verwendet" und nicht zugewiesen wird. Es ist richtig, dass Ihre Anwendung möglicherweise nur 20 MB verwendet, aber 5 MB, die für zukünftige Zuweisungen kostenlos sind.

Ich bin mir nicht sicher, ob die Adobe-Dokumente Aufschluss darüber geben würden, wie sie den Speicher verwalten ...

Quelle
Translate

Leider wenn es um Speicherverwaltung in gehtFlash / ActionscriptSie können nicht viel tun. ActionScript wurde so konzipiert, dass es einfach zu bedienen ist (sie wollten also nicht, dass sich die Leute um die Speicherverwaltung kümmern müssen).

Das Folgende ist eine Problemumgehung, anstatt eine zu erstellenByteArrayVariable 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;

WobyteArrayist eine dynamische Eigenschaft vonbyteObjectkönnen Sie den dafür zugewiesenen Speicher freigeben.

Quelle
Translate

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

Macht der Flash Player so etwas wie Java und reserviert er Heap-Speicherplatz und gibt ihn erst frei, wenn die App beendet wird?

Ja und nein, wie Sie vielleicht aus unzähligen Blogposts 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 lassen und andere Vorgänge ausführen, die erheblichen Speicherplatz beanspruchen, wird der vorherige Speicherplatz freigegeben. Sie können dies mit dem Profiler über Nacht sehen, wobei einige Tests über Ihrer App ausgeführt werden.

Quelle
York Lee
Translate

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

Der Player "gibt" den Speicher 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 möchten Sie auch die Profiling-Tools von FlexBuilder verwenden, mit denen Sie feststellen können, ob tatsächlich Speicherlecks vorliegen.

Quelle