Effektive Speicherverwaltung mit Javas Referenzobjekten

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.

Page: 1 2 3

ZDNet.de Redaktion

Recent Posts

MadMxShell: Hacker verbreiten neue Backdoor per Malvertising

Die Anzeigen richten sich an IT-Teams und Administratoren. Ziel ist der Zugriff auf IT-Systeme.

3 Tagen ago

April-Patches für Windows legen VPN-Verbindungen lahm

Betroffen sind Windows 10 und Windows 11. Laut Microsoft treten unter Umständen VPN-Verbindungsfehler auf. Eine…

3 Tagen ago

AMD steigert Umsatz und Gewinn im ersten Quartal

Server-CPUs und Server-GPUs legen deutlich zu. Das Gaming-Segment schwächelt indes.

3 Tagen ago

Google stopft schwerwiegende Sicherheitslöcher in Chrome 124

Zwei Use-after-free-Bugs stecken in Picture In Picture und der WebGPU-Implementierung Dawn. Betroffen sind Chrome für…

5 Tagen ago

Studie: 91 Prozent der Ransomware-Opfer zahlen Lösegeld

Die durchschnittliche Lösegeldzahlung liegt bei 2,5 Millionen Dollar. Acht Prozent der Befragten zählten 2023 mehr…

5 Tagen ago

DMA: EU stuft auch Apples iPadOS als Gatekeeper ein

Eine neue Analyse der EU-Kommission sieht vor allem eine hohe Verbreitung von iPadOS bei Business-Nutzern.…

5 Tagen ago