Haben Sie jemals PhantomReference in einem Projekt verwendet?
Das einzige, was ich weiß, über PhantomReference
ist,
- Wenn Sie Ihren
get()
Methode, es wird immer wiedernull
und nicht das Objekt. Was ist der nutzen? - Mithilfe
PhantomReference
Sie machen es sicher, dass das Objekt kann nicht wiederbelebt werden vonfinalize
Methode.
Aber was ist die Verwendung dieses Begriffs/- Klasse?
Haben Sie jemals verwendet diese in Ihren Projekt-oder haben Sie irgendein Beispiel, wo sollten wir verwenden?
Kommentare dem Thema
Als Sie nicht bekommen kann die genannten obj eine PhantomReference, es ist ein völliger Fehlgriff: Es hätte als
FakeReference
oder NonReference
. Hier ist anothre thread mit code: stackoverflow.com/q/43311825/632951
InformationsquelleAutor der Frage Rakesh Juyal | 2009-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verwendet
PhantomReference
s in einem simpel, sehr spezielle Art von Speicher-profiler zum überwachen von Schöpfung und Zerstörung. Ich brauchte Sie, um zu verfolgen Zerstörung. Aber der Ansatz ist veraltet. (Geschrieben wurde es im Jahr 2004 targeting J2SE 1.4.) Professionelles profiling-Werkzeuge sind wesentlich leistungsfähiger und zuverlässiger und die neuen Java 5 features wie JMX oder JVMTI-Agenten und kann verwendet werden, für das auch.PhantomReference
s (immer zusammen mit der Referenz-Warteschlange) überlegen sindfinalize
die hat einige Probleme und sollte daher vermieden werden. Vor allem macht Objekte wieder erreichbar. Dies kann vermieden werden, mit dem finalizer guardian idiom (-> Lesen Sie mehr in 'Effective Java'). Sie sind also auch der neuen abschließen.Darüber hinaus
PhantomReference
sUnd als psd schrieb, Roedy Green hat eine gute Zusammenfassung von Referenzen.
InformationsquelleAutor der Antwort Peter Kofler
Einen Allgemeine gewürfelt-up-Tabelle Erklärung, aus der Java-Glossar.
Was natürlich deckt sich mit der PhantomReference Dokumentation:
Und nicht zuletzt, all die blutigen details (dies ist eine gute Lektüre): Java-Referenz-Objekte (oder How I Learned to Stop Worrying and Love OutOfMemoryError).
Happy coding.
(Aber um die Frage zu beantworten, ich habe immer nur verwendet WeakReferences.)
InformationsquelleAutor der Antwort
Fand ich eine praktische und nützliche Verwendung bei
PhantomReference
dieorg.apache.commons.io.FileCleaningTracker
im commons-io-Projekt.FileCleaningTracker
wird, löschen Sie die Datei, wenn Ihre marker-Objekt ist garbage Collection.Etwas zur Kenntnis zu nehmen, ist die
Tracker
- Klasse, die erweitertPhantomReference
Klasse.InformationsquelleAutor der Antwort Tan Hui Onn
Tolle Erklärung der Phantom-Referenz-usage:
InformationsquelleAutor der Antwort shevchyk
Habe ich eine PhantomReference in einem unit-test zu überprüfen, dass der code unter test nicht halten unnötigen Daten Referenzen auf ein Objekt. (Original code)
Und die test:
InformationsquelleAutor der Antwort jontejj
SOLLTE DIESER VERALTET SEIN, MIT JAVA-9!
Verwenden
java.util.Cleaner
statt! (Odersun.misc.Cleaner
auf älteren JRE)Original post:
Fand ich, dass die Verwendung von PhantomReferences hat fast die gleiche Menge Fallstricke als finalizer-Methoden (aber weniger Probleme, wenn Sie es richtig machen).
Ich habe geschrieben eine kleine Lösung (einem sehr kleinen Rahmen zu verwenden, PhantomReferences) für Java 8.
Es ermöglicht die Verwendung von lambda-Ausdrücken als callbacks werden ausgeführt, nachdem das Objekt entfernt wurde. Sie können sich registrieren der callbacks für die inneren Ressourcen, die geschlossen werden sollten.
Mit diesem habe ich eine Lösung gefunden, die funktioniert für mich, wie es macht es viel praktischer.
https://github.com/claudemartin/java-cleanup
Hier ist ein kleines Beispiel, um zu zeigen, wie ein callback registriert ist:
Und dann gibt es da noch einfachere Methode für das automatische schließen, tun das gleiche wie oben beschrieben:
Ihre Fragen zu beantworten:
Kann man nicht bereinigen, dass etwas nicht existiert. Aber es hätte Ressourcen, die noch vorhanden sind und die bereinigt werden müssen, damit Sie entfernt werden können.
Es ist nicht unbedingt etwas zu tun mit jedem anderen Effekt als debugging/logging. Oder vielleicht für die Statistik.
Ich sehe es mehr wie eine Benachrichtigung von der GC.
Sie könnten auch wollen, es zu benutzen, entfernen Sie aggregierte Daten, die irrelevant wird, sobald das Objekt entfernt wird (aber es gibt wahrscheinlich bessere Lösungen für, die).
Beispiele oft erwähnen, Datenbank-verbindungen geschlossen werden, aber ich sehe nicht, wie das ist so eine gute Idee, da Sie nicht arbeiten konnte mit den Transaktionen. Ein application-framework, wird eine viel bessere Lösung dafür.
Benutze ich es meist nur für die Anmeldung. So kann ich nachvollziehen, die entfernten Elemente und sehen, wie GC funktioniert und können optimiert werden. Ich würde nicht laufen alle kritischen code in dieser Art und Weise. Wenn etwas geschlossen werden muss, dann sollte es auch getan werden in einem try-mit-Ressourcen-statement.
Und ich benutze es in unit-tests, um sicherzustellen, dass ich don ' T haben keine Speicher-Lecks. Der gleichen Weise wie jontejj tut es. Aber meine Lösung ist ein bisschen allgemeiner.
InformationsquelleAutor der Antwort Claude Martin
Ist es üblich mit
WeakReference
woPhantomReference
mehr angemessen ist. Dies vermeidet bestimmte Probleme des seins in der Lage, wieder aufleben Objekte nach einemWeakReference
gelöscht/in die Warteschlange eingereiht, die durch den garbage collector. In der Regel ist der Unterschied spielt keine Rolle, weil die Leute nicht spielen, dumme Kerle.Mit
PhantomReference
neigt dazu, ein bisschen mehr aufdringlich, denn man kann nicht behaupten, dass dieget
Methode funktioniert. Sie können nicht, zum Beispiel, schreiben Sie einePhantom[Identity]HashMap
.InformationsquelleAutor der Antwort Tom Hawtin - tackline
Nützlichen Methoden zu nennen (anstatt
get()
) wäreisEnqueued()
oderreferenceQueue.remove()
. Würden Sie diese Methoden aufrufen, um eine bestimmte Aktion ausführen muss, statt auf die Letzte Runde der garbage collection das Objekt.Beim ersten mal ist, wenn das Objekt seiner
finalize()
- Methode aufgerufen, so könnte man schließen Haken gibt es auch. Jedoch, wie andere gesagt haben, gibt es wahrscheinlich mehr sicher Möglichkeiten der Durchführung Aufräumen oder was auch immer handeln muss vor und nach der garbage collection oder, mehr generell, nach dem Ende der Lebensdauer des Objekts.InformationsquelleAutor der Antwort