Frage Entladen eines ByteArray mit Actionscript 3


Wie entwerfe ich gewaltsam ein 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;
}

76
2017-08-01 12:30


Ursprung


Antworten:


Ich glaube nicht, dass du dir Sorgen machen musst. Ob System.totalMemory geht runter du kannst dich entspannen. Es kann sehr gut das Betriebssystem sein, das den neu freigegebenen Speicher nicht zurückfordert (in Erwartung des nächsten Mal, dass Flash Player nach mehr Speicher fragt).

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

Wie ich es verstanden habe, ist die Speicherverwaltung in modernen Betriebssystemen aus der Perspektive der Betrachtung der jedem Prozess zugewiesenen Beträge oder sogar der gesamten zugewiesenen Menge nicht intuitiv.

Wenn ich meinen Mac 5 Minuten lang benutzt habe, werden 95% meiner 3 GB RAM verwendet, und das wird so bleiben, es geht nie unter. So behandelt das Betriebssystem Speicher.

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


31
2017-08-14 17:05



(Ich bin nicht positiv, aber ...)

AS3 verwendet eine nicht-deterministische Garbage Collection. Dies bedeutet, dass nicht referenzierter Speicher freigegeben wird, wenn sich die Laufzeit anfühlt (normalerweise nicht, es sei denn, es gibt einen Grund zum Ausführen, da dies eine teure Operation ist). Dies ist derselbe Ansatz, der von den meisten modernen Garbage Collection-Sprachen verwendet wird (wie C # und Java).

Angenommen, es gibt keine weiteren Referenzen auf den Speicher, auf den gezeigt wird byteArray oder die Elemente innerhalb des Arrays selbst, wird der Speicher irgendwann nach dem Verlassen des Bereichs freigegeben byteArray ist erklärt.

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

Um einen GC zu erzwingen, versuche (ja, zweimal):

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

Sie können hier mehr lesen.


22
2017-08-01 13:08



Sehen 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-start-the-garbage-collector-in-actionscript-3-with-air/

Daher würde ich empfehlen, den Code für die Sammlung auszuprobieren, um 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();
}

17
2017-08-01 13:08



Ich glaube, du hast deine eigene Frage beantwortet ...

System.totalMemory gibt Ihnen die Gesamtmenge des Speichers, der "verwendet" wird, nicht zugewiesen. Es ist korrekt, dass Ihre Anwendung möglicherweise nur 20 MB verwendet, aber es hat 5 MB, die für zukünftige Zuweisungen frei ist.

Ich bin mir nicht sicher, ob die Adobe-Dokumentation Aufschluss darüber geben würde, wie die Speicherverwaltung funktioniert ...


14
2017-08-01 14:03



Leider, wenn es um Speicherverwaltung in. Geht Flash / ActionScript Es gibt nicht viel, was Sie tun können. ActionScript wurde so entworfen, dass es einfach zu verwenden ist (damit die Benutzer sich nicht um die Speicherverwaltung kümmern müssen)

Das folgende ist eine Problemumgehung, anstatt ein ByteArray Variable versuche das.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Woher byteArray ist eine dynamische Eigenschaft von byteObject, können Sie den Speicher freigeben, der dafür reserviert wurde.


14
2017-08-01 13:14



Also, wenn ich sage 20MB von MySQL laden, im Task-Manager der RAM für die Anwendung geht um etwa 25 MB. Wenn ich dann die Verbindung schließe und versuche, das ByteArray zu entfernen, wird der RAM nie freigegeben. Wenn ich System.totalMemory verwende, zeigt Flash Player jedoch an, dass der Speicher freigegeben wird, was nicht der Fall ist.

Spielt der Flash Player so etwas wie Java und reserviert den Heap-Speicher und gibt ihn nicht frei, bis die App beendet wird?

Nun ja und nein, wie Sie vielleicht aus unzähligen Blogposts gelesen haben, ist der GC in AVM2 optimistisch und wird seine eigenen mysteriösen Wege gehen. Es funktioniert also ein wenig wie Java und versucht, den Heap-Speicherplatz zu reservieren. Wenn Sie es jedoch lange genug belassen und andere Operationen ausführen, die beträchtlichen Speicherbedarf haben, wird der vorherige Speicherplatz freigegeben. Sie können dies über den Profiler über Nacht sehen, wobei einige Tests auf Ihrer App ausgeführt werden.


9
2017-09-17 10:09



Also, wenn ich sage 20MB von MySQL laden, im Task-Manager der RAM für die Anwendung geht um etwa 25 MB. Wenn ich dann die Verbindung schließe und versuche, das ByteArray zu entfernen, wird der RAM nie freigegeben. Wenn ich System.totalMemory verwende, zeigt Flash Player jedoch an, dass der Speicher freigegeben wird, was nicht der Fall ist.

Der Spieler gibt den Speicher frei. Wenn Sie das Fenster minimieren und es wiederherstellen, sollten Sie sehen, dass das Memoire jetzt viel näher an dem ist, was System.totalMemory zeigt.

Sie könnten auch daran interessiert sein, FlexBuilders Profiling-Tools zu verwenden, die Ihnen zeigen können, ob Sie tatsächlich Speicherlecks haben.


8
2017-10-06 18:16