Frage

Ich habe eine ziemlich große Flex & Papervision3D Anwendung, die ständig Objekte zerstört erstellt und. Es ist auch lädt und entlädt SWF-Ressource-Dateien zu. Während es läuft verbraucht den SWF langsam Speicher bis zu 2 GB, wenn es den Spieler krächzt. Offensichtlich bin ich ziemlich sicher, dass ich gehe Referenz lassen Instanzen ich nicht mehr mit der Erwartung will, dass der GC wird seine Arbeit tun. Aber ich bin ein Heck einer Zeit zu haben, herauszufinden, wo das Problem liegt.

Ich habe versucht, für die Erfassung Speicherabbildern die Profiler und seine Optionen, etc. - aber mein Problem bleibt ausweichend. Ich denke, es gibt bekannte Probleme auch Debug-Flash-Player verwenden? Aber ich habe keine Freude entweder die Release-Version verwendet wird.

Wie gehen Sie über Speicherleck Probleme FLEX / AS3 mit aufzuspüren? Was sind einige Strategien, Tricks oder Werkzeuge, die Sie verwendet haben, Verbrauch zu finden

War es hilfreich?

Lösung

ich über etwas gestolpert zu erklären, wie Flex Profiler in Flex Builder zu verwenden, und es war eine große Hilfe für mich Speicherlecks bei der Fehlersuche. Ich würde auf jeden Fall empfehlen, es auszuprobieren. Es ist sehr einfach zu bedienen. Einige Dinge finde ich, wenn meine Anwendungen Profilierungs:

Vermeiden Sie Sammlungen mit (zumindest große Sammlungen) als Eigenschaften von Wertobjekten. Ich hatte verschiedene Arten von Wertobjektklassen in meiner Cairngorm Anwendung und jeder hatte eine „Kinder“ Eigenschaft, die ein ArrayCollection war, und wurde zur Filterung verwendet. Wenn Profilieren, fand ich, dass diese waren einer meiner größten Speicherfresser, so änderte ich meine Anwendung die „parentId“ stattdessen speichern als int und nutzen diese für die Filterung. Der Speicher verwendet wurde drastisch reduziert. So etwas wie folgt aus:

Alte Art und Weise:

public class Owner1
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner2 Objects
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner3 Objects
}

public class Owner3
{
    public var id:int;
    public var label:String;
}

New Way:

public class Owner1
{
    public var id:int;
    public var label:String;
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner1 Object
}

public class Owner3
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner2 Object
}

Ich würde auch vorschlagen, Ereignis-Listener zu entfernen, wenn sie nicht mehr benötigt werden.

Andere Tipps

ich in der Regel ein Bereinigungsverfahren in jeder Klasse implementieren ich machen (da AS Destruktoren nicht haben). Das Hauptproblem ich mit dem GC bemerkt habe, ist mit Event-Listener. Zusätzlich zu, was dirkgently sagte, versuchen auch anonyme Listener-Funktionen zu vermeiden (wie Sie sie nicht explizit entfernen). Hier sind ein paar Links können Sie nützlich finden:

wegen Fragen wie diese ich eine Open-Source-Bibliothek entwickelt haben, die zu einem bestimmten Zeitpunkt alle Ereignisse Ihre Lauf hilft überwachen. es ist wirklich einfach zu implementieren und ich habe wieder einkalkuliert Projekte in 10-15 Minuten Umwandlung sie den Ereignisverwalter zu verwenden, die ich entwickelt habe.

im Grunde für Ihr Szenario würde ich alle durch die Ereignisse laufen und ersetzen Sie sie aus: obj.addEventListener (...);

zu: EC.add (obj, ...);

der Rest ist das gleiche, was das tun würde, ist das Ereignis registrieren und es ist verrückt leicht machen alle an jedem Punkt Ihre Veranstaltungen zu sehen, möchten Sie die EC.log mit ();

alle Details und Dokumentation sind auf meiner Seite würde ich gerne wissen, ob dies hilft Ihnen, und wenn Sie anfangen, mit ihm zu arbeiten. wenn ihr Feedback gut oder schlecht fühlen Sie sich bitte frei, es zu schreiben und ich würde in sie aussehen!

die Seite ist: http://fla.as/ec/

Wenn Ihr Speicherverlust exponentiell wächst, bedeutet dies wahrscheinlich, GC versagt, seine Arbeit zu tun. Werfen Sie einen Blick auf den Code und sehen, wo Sie Ihre Objekte Referenzzähler verringern können (durch Einstellung null). Machen Event-Handler schwach. Und wieder Profil.

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