2016-05-05 12 views
1

Angenommen, ich habe drei Objekte, A, B und C.Java Soft-Referenzen

A mit einem weichen Bezug auf B bezieht.
B bezieht sich auf A mit einer starken Referenz.
B bezieht sich auch auf C mit einer starken Referenz.
C bezieht sich auch auf B mit einer starken Referenz.
C bezieht sich auch auf A mit einer starken Referenz.

Nehmen wir an, dass es keine externen Referenzen zu B oder C gibt. Wenn wir uns eine Situation vorstellen, in der der Garbage Collector entscheidet, dass, wenn es möglich ist, versucht wird, den Speicher freizugeben, auf den weiche Referenzen zeigen, werden B und freigegeben, A? Oder tritt eine Art zirkuläre Abhängigkeit auf, bei der die Backlinks von B und C bis A irgendwie verhindern, dass eine Speicherbereinigung stattfindet? Mein Verständnis ist, dass der GC Soft-Referenzen sammeln sollte, bevor OutOfMemory geworfen wird.

Dies ist eine sehr speicherintensive Anwendung, die eine sehr große Hierarchie modelliert, und als solche möchte ich, dass der GC "Zweige" der Hierarchie verwerfen, solange es keine starken Verweise darauf gibt. Ich kann die Zweige bei Bedarf neu generieren, aber das ist rechenintensiv, also habe ich einen Cache mit weichen Referenzen implementiert. Meine allgemeine Strategie besteht darin, weiche Referenzen zu haben, die nach unten zeigen (d. H. Zu Unterknoten des Baums) und starke Referenzen, die zurück zu den Elternknoten zeigen.

+0

Ja, B und C können GC'd, aber der Garbage Collector _extremely_ stumm in Bezug auf die Auswahl, welche weichen Verweise auf GC ist. –

+0

Das ist in Ordnung, solange es die Sammlungen schließlich tut. Um das gesamte, echte Datenmodell zu speichern, würden ungefähr 80 GB Speicher benötigt. Der Caching-Mechanismus scheint zu funktionieren, aber ich wollte sicher sein. – bss36504

+0

Ich schlage vor, Sie haben einen kleinen Cache, der völlig starke Referenzen ist, und dies überläuft einen Cache von weichen/schwachen Referenzen.Auf diese Weise, wenn Sie GC und das System aufholen müssen, verliert es auch nicht seinen Cache vollständig (dh Sie könnten fast alle weichen Referenzen gefunden werden bereinigt) –

Antwort

2

Harte Referenzen, die auf den Baum zeigen, verhindern nicht, dass B und C gesammelt werden.

3

Wir nehmen an, dass es eine externe starke Referenz zum Objekt A gibt. (Dh einig „root“ Objektpunkte zu A.)

Durch definition, Objekt B ist sanft zu erreichen, weil es keine Kette von starken Referenzen ist B zu erreichen, aber es ist eine Kette, die von starken und weichen Artikeln besteht zu erreichen B. So kann B nach Ermessen der JVM Müll gesammelt werden.

In ähnlicher Weise ist das Objekt C nicht stark erreichbar, ist aber leicht erreichbar, daher kann es auch in der gleichen Weise wie B Müll gesammelt werden.

Aufgrund der Definition, Objekte aus der Wurzel zu erreichen, macht die Tatsache, dass B und C einen Zyklus bilden, keinen Unterschied. Java verwendet eine allgemeine Ablaufverfolgungs-Garbage-Collection (Mark-and-Sweep oder Kopieren), die gegenüber Referenzzyklen immun ist, auf die Refcount-basierte Garbage-Sammlungen leiden.

enter image description here