Referenzobjekte sind eine spezielle Art von Objekten, die Referenzen zu anderen Objekten in einer solchen Weise halten, dass der Garbage Collector dennoch den Speicher des referenzierten Objekts zurückfordern kann – dies wird auch als schwache Referenz bezeichnet. Referenzobjekte ermöglichen einem Programm, Referenzen auf Objekte beizubehalten, die bei Bedarf – wie z.B. bei zu wenig Speicherplatz – zurückgefordert werden können.
Referenzobjekte sind durch die Klassen SoftReference und WeakReference vertreten und sind im Paket java.lang.ref zu finden. Der Hauptunterschied zwischen diesen beiden Klassen ist, dass der Garbage Collector unterschiedliche Algorithmen benutzt bei der Entscheidung, wann die referenzierten Objekte zurückzufordern sind. Praktisch sind sie untereinander austauschbar, weswegen im weiteren Verlauf dieses Artikels der Begriff Referenzobjekt jede dieser Klassen bezeichnen kann.
Um eine schwache Referenz auf ein Objekt zu erstellen, wird dieses Objekt an den Konstruktor des Referenzobjekts weitergegeben. Ist es einmal erstellt, ist die schwache Referenz eines Referenzobjekts unveränderbar. Man kann sie nur mit der clear-Methode löschen.
Die get-Methode eines Referenzobjekts holt das an den Konstruktor des Referenzobjekts weitergegebene Objekt zurück bzw. gibt null zurück, wenn die clear-Methode aufgerufen wurde. Ist ein Objekt nur über schwache Referenzen erreichbar, wird es zum Kandidaten für den Garbage Collector. Entscheidet dieser, dass es Zeit ist, den Speicher eines schwach referenzierten Objekts zurückzufordern, werden zunächst sämtliche von Referenzobjekten gehaltenen schwachen Referenzen auf das Objekt gelöst, so dass dessen Aufruf null zurückgibt, genau so, als hätte man die clear-Methode selbst aufgerufen.
Ein Beispiel
Referenzobjekte sind am einfachsten zu verstehen, wenn man sie in Aktion sieht. Listing A zeigt ein Beispiel davon. Hier gibt es eine Klasse namens MemoryBlock, die nur eine einzige Aufgabe hat: Speicherplatz zu belegen. Jeder MemoryBlock hat eine ID (zur Identifizierung) und eine Größe, die ungefähr der Menge des von ihm belegten Speichers entspricht. Die MemoryBlock-Klasse gibt zudem eine Nachricht mit create- und finalize-Datum aus, wodurch deren Lebenszyklus überwacht werden kann.
Listing B zeigt den Code eines einfachen Beispiel, das MemoryBlock zur wiederholten Reservierung von Speicherblöcken benutzt, wobei der erste Block 64 KB beansprucht und jeder Block doppelt so groß ist wie der vorhergehende. Jeder MemoryBlock wird in einer ArrayList gespeichert, die bei jeder Iteration einer Endlosschleife ausgegeben wird.
Die Anzeigen richten sich an IT-Teams und Administratoren. Ziel ist der Zugriff auf IT-Systeme.
Betroffen sind Windows 10 und Windows 11. Laut Microsoft treten unter Umständen VPN-Verbindungsfehler auf. Eine…
Server-CPUs und Server-GPUs legen deutlich zu. Das Gaming-Segment schwächelt indes.
Zwei Use-after-free-Bugs stecken in Picture In Picture und der WebGPU-Implementierung Dawn. Betroffen sind Chrome für…
Die durchschnittliche Lösegeldzahlung liegt bei 2,5 Millionen Dollar. Acht Prozent der Befragten zählten 2023 mehr…
Eine neue Analyse der EU-Kommission sieht vor allem eine hohe Verbreitung von iPadOS bei Business-Nutzern.…