Frage

Ich habe ein bisschen ein Speicherverlust-Problem in meiner Flex-Anwendung und die kurze Version meiner Frage ist: Gibt es eine Möglichkeit (in AcitonScript 3) alle Live-Bezüge auf ein bestimmtes Objekt zu finden

?

Was ich habe, ist eine Reihe von Ansichten mit Präsentationsmodellen hinter jedem von ihnen (mit Swiz). Die Ansichten von Interesse sind Kinder eines TabNavigator, so, wenn ich die Registerkarte zu schließen, wird der Blick von der Bühne entfernt. Wenn die Ansicht von der Bühne entfernt wird, setzt das Modell Swiz Referenz im Hinblick auf null, wie es sollte. Ich auch removeAllChildren () aus der Ansicht.

Wenn jedoch die Anwendung Profilierungs, wenn ich dies tun und eine GC laufen, weder die Sicht noch das Präsentationsmodell frei werden (obwohl beide auf ihre Bezüge zueinander zu null). Ein Modellobjekt von der Ansicht verwendet wird (kein Moderator, obwohl) freigegeben wird, so ist es nicht vollständig gebrochen.

Ich habe gerade erst begonnen, heute Profilierungs (fest zu glauben, nicht zu früh zu optimieren), so stelle ich mir es ist eine Art Referenz irgendwo schwimmen, aber ich kann nicht sehen, wo und was wäre super hilfreich wäre die Fähigkeit zum Debuggen und eine Liste von Objekten sehen, dass das Zielobjekt verweisen. Ist das überhaupt möglich ist, und nicht nativ, wenn gibt es einige leichte Art und Weise, um Code dieses in zukünftigen Anwendungen für Debugging-Zwecke?

Prost.

War es hilfreich?

Lösung

Angenommen, Sie Flex Builder verwenden, können Sie den Profiler versuchen. Nach meiner Erfahrung ist es nicht so gut für die Performance Profilierung, aber es ist für die Suche nach Speicherlecks von großer Hilfe.

Es ist nicht das intuitive Werkzeug, und es dauert eine Weile, um sich daran zu gewöhnen (ich meine, bis zu dem Punkt, wo es wird tatsächlich hilfreich). Aber meiner Meinung nach, investieren einige Zeit in Anspruch zumindest lernen die Grundlagen auszahlt. Es gibt einen enormen Unterschied zwischen nur sehen, wie viel Speicher der Spieler weltweit verwendet (was System.totalMemory gibt Ihnen eine sehr grobe, ungenau und oft irreführend Indikator) und tatsächlich verfolgen, wie viele Instanzen jedes Objekt erstellt wurden, wie viele sind noch lebendig und wo sie zugeordnet (so dass Sie das Potenzial Leck im Code finden können und es tatsächlich beheben, statt in schwarzer Magie zu verlassen).

Ich weiß nicht, von jedem guten Tutorials für den FB-Profiler, aber vielleicht wird diese Ihnen helfen, begonnen zu erhalten.

Starten Sie zuerst den Profiler. Deaktivieren Sie die Option Performance Profilierungs und Kontrolle alles andere (Enable Speicherprofilierungs, Live-Speicherdaten beobachten und Objektzuordnung Stack-Traces erzeugen).

Wenn der Profiler startet, können Sie Statistiken über den App-Objekte, gruppiert nach Klasse sehen werden. An diesem Punkt sollten Sie Filter zwicken. Sie werden eine Menge von Daten sehen und es ist sehr leicht überwältigt werden. Denn jetzt, ignorieren alles native Flash und Flex stuff, wenn möglich, und konzentrieren sich auf ein Objekt, dass Sie denken, es sollte gesammelt werden.

Die wichtigsten Zahlen sind „kumulative Instanzen“ und „Instanzen“. Die erste ist die Gesamtzahl der Fälle bisher erschaffen; die zweite, die Anzahl der Instanzen, die noch am Leben sind. Also, ein guter Ausgangspunkt ist erhalten Sie Ihre App in den Zustand, in dem die Ansicht, die Sie vermuten, dass Lecks erstellt wird. Sie sollten 1 für „kumulative Instanzen“ und „Instanzen“ sehen.

Nun, tun, was Sie tun müssen, um zu dem Punkt zu gelangen, wo diese Ansicht gereinigt werden soll (navigieren Sie zu anderem Teil der App, etc.) und führen eine GC (es gibt eine Taste für die im Profiler UI). Ein entscheidender Punkt ist, dass Sie die App Verhalten gegen Ihre Erwartungen werden überprüft -wenn das macht Sinn-. Lecks automatisch in einer garbarge gesammelt Umgebung zu finden, ist fast unmöglich durch Definition schließen; sonst gäbe es keine Lecks sein. Also, halten Sie daran: Sie Ihre Erwartungen testen gegen; Sie sind derjenige, der den gesamten Lebenszyklus Ihrer Objekte kennt und sagen kann „an dieser Stelle diese Aufgabe gesammelt werden sollte, wenn es nicht ist, etwas nicht in Ordnung ist“

.

Wenn nun der „Instanzen“ count für Sie sehen auf 0 untergeht, gibt es kein Leck gibt. Wenn Sie die App Lecks denken, versuchen, andere Objekte zu finden, die nicht entsorgt wurden ordnungsgemäß könnten. Wenn die Zählung bei 1 bleibt, bedeutet dies Ihrer Ansicht nach ist durchgesickert. Nun, Sie werden feststellen müssen, wo und warum.

An diesem Punkt sollten Sie ein „Speicherabbild“ nehmen (die Schaltfläche neben der Force-GC-Taste). Öffnen Sie den Snapshot finden Sie das Objekt im Raster und klicken Sie doppelt darauf. Dies wird Ihnen eine Liste aller Objekte, die einen Verweis auf dieses Objekt haben. Es ist eigentlich ein Baum, und wahrscheinlich jedes Einzelteil wird wiederum eine Reihe von Rückreferenzierungen enthalten und so weiter. Dies sind die Objekte, die Ihrer Ansicht nach werden verhindert gesammelt werden. In der rechten Seite, auch, werden Sie eine Zuordnung Spur. Dies wird zeigen, wie das ausgewählte Objekt (so ziemlich wie ein Stack-Trace) erstellt wurde.

Sie werden wahrscheinlich eine hugh Anzahl der Objekte dort sehen. Aber Ihre beste Wette ist, in denen zu konzentrieren, die eine längere Lebensdauer als das Objekt haben Sie die Prüfung (die Ansicht). Was ich meine ist, sucht die Bühne, eine übergeordnete Ansicht, etc; Objekte, auf denen Ihre Ansicht nach eher auf hängt als objets, die nach Ihrer Ansicht abhängen, wenn der Sinn macht. Wenn Ihre Ansicht eine Schaltfläche hat und man hat einen Zuhörer es, Ihre Schaltfläche, um eine ref zu Ihrer Ansicht hat. In den meisten Fällen ist dies kein Problem, da die Taste auf der Ansicht hängt, und sobald die Ansicht collect, so ist die Taste. So ist die Idee, dass da es eine Menge von Objekten sind, sollten Sie versuchen, konzentriert zu bleiben, oder Sie werden nicht weiter. Diese Methode ist eher heuristisch, aber nach meiner Erfahrung, es funktioniert.

Wenn Sie die Quelle eines Lecks finden, gehen zurück an die Quelle, den Code entsprechend ändern (vielleicht erfordert dies nicht nur Code zu ändern, aber Refactoring ein bisschen). Dann wiederholen Sie den Vorgang und prüfen, ob die Änderung die gewünschte Wirkung verursacht hat. Es könnte eine Weile dauern, je nachdem, wie groß oder komplex ist Ihre App und wie viel wissen Sie darüber. Aber wenn Sie Schritt für Schritt gehen, zu finden und ein Problem zu dem Zeitpunkt Festsetzung, werden Sie schließlich loszuwerden, die Lecks. Oder zumindest die schlimmsten und deutlicher diejenigen. Während also ein bisschen langweilig, es zahlt sich aus (und als eine schöne Seite, werden Sie schließlich verstehen, was eine Verschwendung von Zeit in den meisten Fällen ist schwach Refs auf dem Gesicht dieser Erde für jeden einzelnen Event-Handler zu verwenden, aus jeder nulling einzelne Variable, etc, etc, es ist eine aufschlussreiche Erfahrung.;)

Hope, das hilft.

Andere Tipps

Flash-GC verwendet eine Mischung aus ref Zählen und Markierung und fegen, so dass es zirkuläre Referenzen zu erfassen. Es scheint eher sind Sie eine weitere Referenz, die in Ihnen Diagrammobjekt. Der häufigste Grund ist, dass die Objekte, die Sie wollen immer noch angeordnet sind, die Event-Handler registriert auf Objekte, die nicht angeordnet sind. Sie könnten versuchen, um sicherzustellen, dass Handler wird immer mit schwachen Verweise registriert. Sie könnten auch addEventListener und removeEventListener in allen (Basis) Klassen außer Kraft setzen, wenn möglich, zu sehen, welche die Zuhörer registriert sind und ob es Chancen für einige nicht entfernt werden.

Sie können aber auch Destruktoren für Ihre Objekte schreiben, dass für ui Komponenten klare Grafiken und alle Kinder entfernen, und für alle Objekte, entfernt Verweise auf alle Eigenschaften. Auf diese Weise nur das Objekt im RAM gehalten, die nicht viel Speicher benötigen sollten (eine kleine Stellfläche von 20 B oder so, plus 4 B pro Variable (8 für eine Zahl)).

greetz
back2dos

auch eine nützliche Heuristik für die Suche nach Speicherlecks: http://www.tikalk.com/flex/solving-memory-leaks-using-flash-builder-4-profiler

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