Wann Schwache und Phantomreferenzen in Java zu verwenden sind

8

Ich habe viele Artikel gelesen, aber ich verstehe nicht - wo muss ich in der Praxis Schwach- und Phantomreferenzen verwenden? Soft-Referenzen - ist eine gute Wahl für den Cache, wie ich es verstehe. Aber schwach und Phantom, ich weiß nicht wann ich es benutzen soll. Bitte geben Sie Beispiele für echte Aufgaben an, wo wir sie verwenden müssen.

    
VladislavLysov 09.07.2012, 14:49
quelle

5 Antworten

8

Sie können schwache Referenzen für den Cache verwenden, einfach wie weiche Referenzen, wie Sie gesagt haben.

Was nützen PhantomReferenzen? Mir sind nur zwei schwerwiegende Fälle bekannt: Erstens können Sie genau bestimmen, wann ein Objekt aus dem Speicher gelöscht wurde. Sie sind in der Tat der einzige Weg, das zu bestimmen. Dies ist im Allgemeinen nicht so nützlich, kann sich aber unter bestimmten Umständen als sehr nützlich erweisen, z. B. bei der Bearbeitung großer Bilder: Wenn Sie sicher sind, dass ein Bild als Garbage Collection erfasst werden soll, können Sie warten, bis das nächste Bild geladen wird und machen daher den gefürchteten OutOfMemoryError weniger wahrscheinlich.

Zweitens vermeiden PhantomReferences ein grundlegendes Problem bei der Finalisierung: finalize () - Methoden können Objekte "wiederbeleben", indem sie neue starke Referenzen auf sie erstellen. Also was, sagst du? Nun, das Problem besteht darin, dass ein Objekt, das finalize () überschreibt, nun in mindestens zwei separaten Speicherbereinigungszyklen als Müll bestimmt werden muss, um gesammelt zu werden. Wenn der erste Zyklus feststellt, dass es sich um Müll handelt, kann er finalisiert werden. Wegen der (geringen, aber leider realen) Möglichkeit, dass das Objekt während der Finalisierung "wiederbelebt" wurde, muss der Garbage Collector erneut ausgeführt werden, bevor das Objekt tatsächlich entfernt werden kann. Und da die Finalisierung möglicherweise nicht rechtzeitig erfolgt ist, kann es zu einer willkürlichen Anzahl von Speicherbereinigungszyklen kommen, während das Objekt auf die Fertigstellung wartet. Dies kann zu erheblichen Verzögerungen bei der tatsächlichen Bereinigung von Garbage-Objekten führen. Aus diesem Grund können Sie OutOfMemoryErrors auch dann abrufen, wenn der größte Teil des Heaps unbrauchbar ist.

für weitere Details siehe diese Seite: Ссылка

    
MeiSorY 09.07.2012, 15:20
quelle
5

Grundsätzlich verwenden Sie eine schwache Referenz, wenn Sie zusätzliche Daten mit Objekten verknüpfen möchten, deren Quellcode nicht unter Ihrer Kontrolle steht. Durch Verwendung eines schwachen ref verknüpfen Sie den Lebenszyklus Ihrer Meta-Objekte mit dem Lebenszyklus der primären Objekte.

Der Hauptanwendungsfall für Phantomreferenzen ist die Implementierung eines eigenen Finalizer-Threads ohne die Gefahren, die mit dem Standardmechanismus verbunden sind, der gezwungen ist, den Verweis auf das vermeintlich unerreichbare Objekt für den Finalisierungscode zugänglich zu machen.

Soft Refs dienen hauptsächlich zum Caching, aber, wie in einem anderen Beitrag hier erwähnt, können sie in der Praxis ziemlich katastrophale Auswirkungen haben und den eigentlichen Caching-Punkt untergraben. Ein großer GC (der, der deine Soft-Refs löscht) passiert normalerweise erst, wenn der Druck auf die Leistung deiner App steigt. Dies ist die Zeit, in der Sie Ihren Cache am meisten benötigen und die Zeit, in der Sie ihn am wahrscheinlichsten verlieren - alles auf einmal.

    
Marko Topolnik 09.07.2012 16:07
quelle
3

Ich denke, dieser Beitrag beantwortet Ihre Frage ziemlich gut.

Was? ist der Unterschied zwischen einer weichen Referenz und einer schwachen Referenz in Java?

Grundsätzlich ist eine weiche Referenz etwas stärker als eine schwache Referenz. Eine schwache Referenz wird beim nächsten GC-Zyklus verworfen, während eine weiche Referenz im Speicher verbleibt, bis ein Speicherdruck vorhanden ist und die JVM so viel wie möglich zurückgewinnen möchte.

Sie sollten darüber nachdenken, wie wichtig es für Ihr Programm ist, dass der Verweis, den Sie haben, immer noch gültig ist. Für etwas, das extrem billig ist, um eine Referenz zu erstellen, würde ich mich zu einer WeakReference neigen, aber wenn es ein Wert aus einer DB ist, könnten Sie sich der weichen Referenz zuwenden, da Sie eine Abfrage lieber nicht erneut ausführen möchten / p>     

jjathman 09.07.2012 14:56
quelle
2

Dieser Artikel hat eine gute Antwort auf diese Frage.

    
jtahlborn 09.07.2012 15:21
quelle
0

SoftReference-Objekte werden erst gesammelt, wenn alle WeakReference-Objekte als Garbage Collection erfasst wurden.

Legen Sie also weniger wichtige Objekte in WeakReference-Objekte und verwenden Sie SoftReference-Objekte, um wichtigere Objekte zu speichern.

Angesichts dieser Fakten sollten Sie die guten Referenzobjekte verwenden, die Sie in Bezug auf die Garbage Collection benötigen. Die WeakReference wird zuerst gesammelt, dann die SoftReference und schließlich die PhantomReferences.

In der Dokumentation steht:

  • Soft-Referenzen dienen zum Implementieren von speichersensitiven Caches
  • Schwache Referenzen dienen zum Implementieren von kanonisierenden Zuordnungen, die nicht verhindern, dass ihre Schlüssel (oder Werte) zurückgewonnen werden

Übrigens kann es in einigen Fällen für Cache-Zwecke eine gute Idee sein, WeakReference anstelle von SoftReference zu verwenden, da der Cache schwer im Speicher sein kann und deshalb gereinigt werden muss.

Bei PhantomReference ist die Verwendung anders. Sie are for scheduling pre-mortem cleanup actions in a more flexible way than is possible with the Java finalization mechanism.

Dieser Artikel erläutert ein wenig, was sein kann die Verwendung von PhantomReference.

    
alain.janinm 09.07.2012 15:06
quelle