Wenn in Versionen vor JDK1.2 ein Objekt nicht von einer Variablen referenziert wird, kann das Programm das Objekt nicht mehr verwenden. Das heißt, ein Programm kann ein Objekt nur verwenden, wenn es erreichbar ist. Das ist wie im täglichen Leben: Nach dem Kauf eines Artikels in einem Geschäft behält man ihn, wenn er nützlich ist, andernfalls wirft man ihn in den Mülleimer und wird von der Reinigung abgeholt.
Wenn ein Gegenstand in den Mülleimer geworfen wurde, ist es im Allgemeinen unmöglich, ihn aufzuheben und erneut zu verwenden.
Aber manchmal ist die Situation nicht so einfach. Es kann sein, dass Sie auf Gegenstände stoßen, die geschmacklos und geschmacklos sind, und es ist schade, sie wegzuwerfen. Diese Art von Gegenstand ist jetzt nicht mehr nützlich und die Aufbewahrung nimmt Platz in Anspruch. Es ist jedoch nicht kosteneffektiv, ihn sofort wegzuwerfen, da er möglicherweise in der Zukunft verwendet wird. Für solche entbehrlichen Gegenstände gilt als Kompromiss: Wenn zu Hause genügend Platz ist, behalten Sie ihn zuerst zu Hause. Wenn zu Hause nicht genügend Platz vorhanden ist, können Sie die unverzichtbaren Gegenstände nicht unterbringen, selbst wenn Sie den gesamten Müll zu Hause entfernen . Wenn Sie nicht genug Dinge des täglichen Bedarfs haben, werfen Sie diese entbehrlichen Gegenstände weg.
Ab JDK1.2 sind Objektreferenzen in vier Ebenen unterteilt, sodass das Programm den Lebenszyklus des Objekts flexibler steuern kann. Diese vier Ebenen, von hoch nach niedrig, sind: starke Referenz, weiche Referenz, schwache Referenz und virtuelle Referenz.
1. Starkes Zitat
Bei den zuvor in diesem Kapitel vorgestellten Zitaten handelt es sich tatsächlich um starke Zitate, die am häufigsten verwendet werden. Wenn ein Objekt einen starken Bezug hat, ähnelt es einem wesentlichen täglichen Bedarf und der Müllsammler wird es niemals zurückfordern. Wenn nicht genügend Speicherplatz vorhanden ist, würde die Java Virtual Machine lieber einen OutOfMemoryError-Fehler auslösen und das Programm abnormal beenden, als Objekte mit starken Referenzen willkürlich wiederzuverwenden, um das Problem des unzureichenden Speichers zu lösen.
2. Weiche Referenz (SoftReference)
Wenn ein Objekt nur weiche Referenzen hat, ähnelt es den Wegwerfartikeln des täglichen Bedarfs. Wenn genügend Speicherplatz vorhanden ist, wird er vom Garbage Collector nicht zurückgefordert. Wenn nicht genügend Speicherplatz vorhanden ist, wird der Speicher dieser Objekte zurückgefordert. Solange der Garbage Collector es nicht sammelt, kann das Objekt vom Programm verwendet werden. Soft-Referenzen können verwendet werden, um speicherempfindliche Caches zu implementieren.
Soft-Referenzen können in Verbindung mit einer Referenzwarteschlange (ReferenceQueue) verwendet werden. Wenn das durch die Soft-Referenz referenzierte Objekt Garbage Collection ist, fügt die Java Virtual Machine die Soft-Referenz der damit verbundenen Referenzwarteschlange hinzu.
3. Schwache Referenz (WeakReference)
Wenn ein Objekt nur eine schwache Referenz hat, ähnelt es einem Wegwerfartikel des täglichen Bedarfs. Der Unterschied zwischen schwachen Referenzen und weichen Referenzen besteht darin, dass Objekte mit nur schwachen Referenzen einen kürzeren Lebenszyklus haben. Während der Garbage-Collector-Thread den Speicherbereich in seinem Zuständigkeitsbereich scannt, wird, sobald ein Objekt mit nur schwachen Referenzen gefunden wird, dessen Speicher zurückgefordert, unabhängig davon, ob der aktuelle Speicherplatz ausreicht. Da der Garbage Collector jedoch ein Thread mit sehr niedriger Priorität ist, findet er Objekte mit nur schwachen Referenzen möglicherweise nicht unbedingt schnell.
Schwache Referenzen können in Verbindung mit einer Referenzwarteschlange (ReferenceQueue) verwendet werden. Wenn das durch die schwache Referenz referenzierte Objekt durch Müll gesammelt wird, fügt die Java Virtual Machine die schwache Referenz der damit verbundenen Referenzwarteschlange hinzu.
4. Phantomreferenz
Wie der Name schon sagt, ist „Phantomreferenz“ nur dem Namen nach bekannt. Im Gegensatz zu anderen Referenzen bestimmt eine Phantomreferenz nicht den Lebenszyklus des Objekts. Wenn ein Objekt nur Phantomreferenzen enthält, ist es so, als hätte es keine Referenzen und kann jederzeit durch Garbage Collection erfasst werden.
Virtuelle Referenzen werden hauptsächlich verwendet, um die Aktivitäten von Objekten zu verfolgen, die durch Müll gesammelt werden. Ein Unterschied zwischen virtuellen Referenzen, Soft-Referenzen und schwachen Referenzen besteht darin, dass virtuelle Referenzen in Verbindung mit einer Referenzwarteschlange (ReferenceQueue) verwendet werden müssen. Wenn der Garbage Collector die Wiederverwendung eines Objekts vorbereitet und feststellt, dass es noch über eine virtuelle Referenz verfügt, fügt er die virtuelle Referenz der zugehörigen Referenzwarteschlange hinzu, bevor er den Speicher des Objekts wiederverwendet. Das Programm kann feststellen, ob das referenzierte Objekt durch Garbage Collection erfasst wird, indem es ermittelt, ob eine virtuelle Referenz zur Referenzwarteschlange hinzugefügt wurde. Wenn das Programm feststellt, dass der Referenzwarteschlange eine virtuelle Referenz hinzugefügt wurde, kann es die erforderlichen Maßnahmen ergreifen, bevor der Speicher des referenzierten Objekts wiederverwendet wird.
In diesem Buch kann „Zitat“ entweder als Verb oder als Substantiv verwendet werden. Die Leser sollten die Bedeutung von „Zitat“ je nach Kontext unterscheiden.
//Erstelle eine starke Referenz
//Erstellen Sie eine Referenzwarteschlange.
ReferenceQueue
//
WeakReference