Was sind die Vorteile für den Einsatz von WeakReferences?
Ich habe einige memory-leaks in meinem app. Sie alle stammen, um ein bestimmtes view-cluster, ich habe ein loooot von Zeit zu optimieren und zu reduzieren, eine viel kontextuellen vorbei wie möglich. Dies führt mich zu glauben, dass bitmaps verwendet, die in die cluster sind das Problem. So war ich denken, verwenden WeakReferences für alle Verweise auf die bitmaps verwendet, die von den Ansichten. Ich habe noch nie verwendet eine WeakReference und bin nicht sicher, ob dies ist eine gute Anwendung. Kann jeder Körper bieten eine hilfreiche Zeiger oder Tipps?
Hier ist ein sehr gutes blog-post, die Ihnen helfen zu verstehen.
InformationsquelleAutor ahodder | 2011-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorsichtig sein, das ist gefährlich in deinem Fall. Die GC konnte, loszuwerden, alle Ihre bitmaps, während Ihre Anwendung möglicherweise noch benötigen.
Die zentrale Frage, über die WeakReference ist, um den Unterschied zu verstehen mit harten verweisen. Wenn es nicht mehr schwer Verweis auf eine bitmap in Ihrer Anwendung, dann die GC darf atomar entfernen Sie das Objekt aus dem Speicher und alle vorhandenen schwache Referenz wird sofort zeigen Sie auf null. In Ihrem Fall, Sie NICHT verwenden können schwache Referenzen alle über Ihren code.
Hier ist eine Vorstellung von der Lösung. Erstellen Sie ein container-Objekt, das halten schwache Referenzen (nur), um alle Ihre bitmaps. Dein Blick sollte sich immer auf bitmaps mit harten Verweise nur. Wenn eine Ansicht erstellt eine bitmap, es sollte sich in dem container-Objekt. Wenn es will, eine Ansicht, die es erhalten sollten, einen harten Verweis aus dem container.
So, wenn keine Aussicht bezieht sich auf eine bitmap, dann die GC sammelt den Gegenstand ohne Nebenwirkungen für die Aussicht, denn keines hat einen harten Verweis. Bei der Verwendung von schwach referenzierte Objekte, es ist eine gute übung, um explizit festzulegen harte Referenzen auf null, wenn Sie nicht brauchen, das Objekt nicht mehr.
Neben
Hier ist eine schnelle Umsetzung der Lösung (nur um eine Vorstellung zu geben):
Zur Beantwortung Ihrer ersten Frage, der Wert des Containers wird, dass Sie nicht doppelte bitmaps im Speicher (also keine Gefahr von memory leaks). Sie können eine WeakHashMap. Der Wert von WeakReferences ist, dass Sie aktivieren Sie die automatische Bereinigung des Chaos. Keine Notwendigkeit, komplizierte bitmap-release Zeug. Lass einfach die GC seinen job tun.
Ich werde nicht noch Notwendigkeit zu recyceln bitmaps ich?
Habt Ihr auch ein Beispiel für einen möglichen container. Ich fand ein paar, aber Sie waren nicht vollständig; ich möchte einen klaren Blick, so verstehe ich es thouroghly.
Nein, wenn die bitmap in den container, so wird der Aufenthalt in den container so lange, wie es ist ein starker Verweis auf die an anderer Stelle im code. Sobald der GC speichert die bitmap-Objekts der entsprechende Speicherplatz frei ist für andere bitmap. Der Speicher wird automatisch recycelt.
InformationsquelleAutor Jérôme Verstrynge
Den meisten straight-forward-Verwendung von schwachen Referenzen, die ich denken kann, ist ein cache. Sie wollen das hinzufügen von Objekten zu einem cache, aber wenn es keine Referenzen auf das Objekt in der rest der VM, Sie wollen das Objekt, um GC ' ed werden, ohne zu müssen, gehen Sie zurück und entfernen Sie es aus dem cache selbst. Schwache Referenzen erreichen. Fügen Sie eine schwache Referenz auf das Objekt in Ihrem cache. Wenn der cache ist die einzige Sache, die bezieht sich auf Ihr Objekt, es ist geeignet für GC. Versuche zur Verwendung der schwachen Referenz, nachdem das Objekt ist GC ' ed führt zu einer Ausnahme.
Streng genommen, ein Objekt bei der Speicherbereinigung (GC, wenn keine starke Verweise zu bleiben (d.h., ob oder ob nicht jede schwache Referenzen existieren).
Basierend auf Ihre Beschreibung Ihrer situation, ist es nicht klar, dass schwache Referenzen werden Ihnen helfen. Aber wenn Sie stehen vor einer situation, wo Sie brauchen, um bewusst klare Verweise auf Objekte, die nicht mehr benötigt werden, dann werden schwache Verweise kann die Lösung sein. Sie müssen nur sicher sein, dass, wenn nur noch schwache Referenzen bleiben, es ist wirklich OK, um loszuwerden, das Objekt.
InformationsquelleAutor wberry
Notwendigkeit für WeakReferences stammt aus einem Szenario, in dem Sie verwalten müssen, um Metadaten über ein Objekt, für das Sie nicht kontrollieren können.
Ein erfundenes Beispiel wäre
String
, es ist endgültig, und wir nicht verlängern können, aber wenn wir möchten, zu erhalten, einige zusätzliche Daten zu einer bestimmtenString
Instanz, würden wir wahrscheinlich verwenden Sie einMap
Umsetzung, halten würde, diese Metadaten. Für dieses Beispiel werde ich schlage vor, wir möchten, dass die Länge der Zeichenfolge als unsere Metadaten (ja, ich weiß, dass dieString
Objekt hat bereits eine öffentliche Eigenschaft length). So würden wir erstellen einMap
wie diese:Davon ausgehen, dass wir möglicherweise füllen Sie diese Karte in einer bestimmten Methode, und nicht wissen, Wann wir fertig sind mit den Daten, so können wir nicht explizit entfernen Sie die Einträge. Als wir bevölkern die Karte, werden Sie nie unbewohnten, von unseren Referenzen gehalten werden, auf ewig. Wenn die Anwendung läuft für eine lange Zeit, es gibt eine gute chance, dass wir in einen OutOfMemoryError.
Eine Lösung wäre die Verwendung einer
WeakHashMap
Umsetzung.Diese Weise, wenn alle (starken) Referenzen auf den Schlüssel sind Weg, die nächste GC wird verursachen, dass die Eintragung der
WeakHashMap
entfernt werden. (Ja, ich verstehe, dassString
hat einen besonderen Platz in den Herzen der JVM, aber ich gehe davon aus, dass die Zeichenfolge GC würde die gleiche Weise eine normale Objekt wäre in diesem Beispiel erfundene)Ist dies der Ansatz, den Sie verwenden in Ihrer app speichern Sie Ihre Bitmaps in eine Globale Karte), ich denke, das ist definitiv etwas zu schauen.
InformationsquelleAutor nicholas.hauschild
Ich glaube nicht, dass dies die richtige Lösung für Ihr problem. Wie schon andere gesagt haben, wenn Sie mit WeakReferences Sie Ihr code teurer und zerbrechlicher. Die Fragilität tritt auf, weil jedes mal, wenn Sie die schwachen Verweis, Sie könnten möglicherweise eine Ausnahme.
(Ein weiteres Problem ist, dass WeakReferences sind teurer als reguläre Referenzen für die GC zu behandeln. Ich habe keine wirklichen performance-zahlen zu hand, und dies ist wahrscheinlich irrelevant in deinen use-case, aber zumindest eine theoretische Sorge.)
IMO eine bessere Lösung für Ihr problem ist die Verwendung eine gute Speicher-profiler auf die Spur, wo die memory leaks sind tatsächlich auftretenden und zu beheben. Führen Sie die Anwendung für ein bisschen mit einem memory-profiler, identifizieren ein Objekt, das ist ausgelaufen, und verwenden Sie die profiler-Ablaufverfolgung den Pfad oder die Pfade, durch die das Objekt noch erreichbar ist. Sie werden wahrscheinlich feststellen, dass diese zurückverfolgt werden können, um ein oder zwei Fehler, oder die gleichen Fehler Muster wiederholt sich in ein paar Plätze. (Wäre meine Vermutung Ereignis-Listener nicht entfernt zur rechten Zeit.)
InformationsquelleAutor Stephen C