Entladen eines ByteArray mit Actionscript 3

89

Wie entlade ich eine ByteArraymit ActionScript 3 zwangsweise aus dem Speicher?

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;
}
Rann Lifshitz
quelle

Antworten:

34

Ich glaube nicht, dass Sie sich Sorgen machen müssen. Wenn es System.totalMemoryrunter geht, können Sie sich entspannen. Es kann durchaus sein, dass das Betriebssystem den neu freigegebenen Speicher nicht zurückfordert (in Erwartung des nächsten Mal, wenn Flash Player nach mehr Speicher fragt).

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).

Das Ö
quelle
24

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

AS3 verwendet eine nicht deterministische Garbage Collection, was bedeutet, dass dereferenzierter Speicher freigegeben wird, wann immer 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 Speicherbereinigungssprachen (wie C # und Java) verwendet wird.

Angenommen, es gibt keine anderen Verweise auf den Speicher, auf den von byteArrayoder auf die Elemente im Array selbst verwiesen wird , wird der Speicher irgendwann freigegeben, nachdem Sie den byteArraydeklarierten Bereich verlassen haben.

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 .

Karl Seguin
quelle
19

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.

Daher http://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();
}
Jax
quelle
15

Wenn es um die Speicherverwaltung in Flash / Actionscript geht, können Sie leider 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. ByteArrayVersuchen Sie dies , anstatt eine Variable zu erstellen .

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 von ist byteObject, können Sie den dafür zugewiesenen Speicher freigeben.

Roter Baron
quelle
15

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 der Speicher verwaltet wird.

Roter Baron
quelle
10

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 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 Heap-Speicherplatz und gibt ihn erst frei, wenn die App beendet wird?

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

Pedro
quelle
9

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