Debuggen von FLEX/AS3-memory leaks
Ich habe eine ziemlich große Flex & Papervision3D-Anwendung, die erstellt und zerstört Objekte immer wieder. Es lädt und entlädt SWF-Ressource-Dateien zu. Während der Ausführung der SWF-langsam verbraucht Speicher bis über 2 GB, wenn es verreckt der Spieler. Offensichtlich bin ich ziemlich sicher, dass ich gehen lassen, der Verweis auf die Instanzen will ich nicht mehr mit der Erwartung der GC wird seinen job tun. Aber ich habe eine verdammt Zeit, herauszufinden, wo das problem liegt.
Ich habe versucht, mit der profiler und seine Optionen für die Erfassung von Speicherabbildern usw. - aber mein problem bleibt ausweichend. Ich denke, es gibt bekannte Probleme mit debug Flash player auch? Aber ich bekomme keine Freude mit der release-version entweder.
Wie gehen Sie über das aufspüren von memory-leak-Probleme mit FLEX/AS3 ? Was sind einige Strategien, tricks und tools, die Sie verwendet haben, zu lokalisieren Verbrauch
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stolperte ich über etwas erklären wie Flex Profiler in Flex Builder, und es war mir eine GROßE Hilfe beim debugging von Speicherlecks. Ich würde auf jeden Fall vorschlagen, versuchen Sie es heraus. Es ist sehr einfach zu bedienen. Einige Dinge fand ich beim profiling für meine Anwendungen:
Vermeiden Sie die Verwendung von Sammlungen (zumindest die GROßEN Sammlungen) als Eigenschaften von Value-Objekte. Ich hatte mehrere Arten von Wert-Objekt-Klassen in meinem Cairngorm-Anwendung, und jeder hatte einen "Kinder" - Eigenschaft, die eine war
ArrayCollection
, und wurde verwendet für die Filterung. Bei der Profilierung habe ich festgestellt, dass diese waren einer meiner größten Speicher-Fresser, also änderte ich meine Anwendung stattdessen speichern "parentId" alsint
und verwenden Sie diese für die Filterung. Der verwendete Speicher wurde drastisch beschnitten. So etwas wie dieses:Alte Weg:
Neuen Weg:
Ich würde auch vorschlagen, entfernen von Ereignis-Listenern, wenn Sie nicht mehr benötigt werden.
Ich in der Regel implementieren Sie eine cleanup-Methode in jeder Klasse und ich (da nicht Destruktoren). Das Haupt-problem, das ich bemerkt habe mit der GC ist mit Ereignis-Listener. Zusätzliche zu dem, was dirkgently gesagt, auch versuchen zu vermeiden, anonyme listener-Funktionen (da Sie nicht explizit entfernen Sie Sie). Hier sind ein paar links, die Sie nützlich finden können:
aufgrund von Problemen wie diese ich entwickelt eine open-source-Bibliothek, die hilft bei der überwachung aller Ereignisse zu einer beliebigen Zeit laufen. seine wirklich einfach zu implementieren und ich habe neu ausgearbeitete Projekte in 10-15 Minuten konvertieren Sie mit dem EventController, die ich entwickelt habe.
grundsätzlich für dein Szenario würde ich über alle Ereignisse und ersetzen Sie Sie aus:
obj.addEventListener(...);
zu :
EG.add(obj,...);
den rest ist das gleiche, was Sie tun, ist, registrieren Sie die Veranstaltung und machen es verrückt einfach, um alle Ihre Veranstaltungen an der gewünschten Stelle mit der EG.log();
alle Angaben und Unterlagen sind auf meiner Website würde ich gerne wissen, ob das hilft, wenn Sie mit der Arbeit beginnen. wenn Sie irgendein feedback gut oder schlecht fühlen Sie sich bitte frei, um es zu veröffentlichen und ich werde es!
die Website ist:
http://fla.as/ec/
Wenn Ihr memory leak wächst exponentiell, es bedeutet wahrscheinlich, dass GC nicht seine Aufgabe. Werfen Sie einen Blick auf den code und sehen, wo immer Sie können verringern Sie Ihre Objekte' Referenzzähler (indem Sie diesen
null
). Stellen Sie event-Handler schwach. Und re-Profil.