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

Netzwerk-Portfolio für das KI-Zeitalter

Huawei stellt auf der Connect Europe 2024 in Paris mit Xinghe Intelligent Network eine erweiterte…

1 Tag ago

Internet-Tempo in Deutschland: Viel Luft nach oben

Höchste Zeit für eine schnelle Kupfer-Glas-Migration. Bis 2030 soll in Deutschland Glasfaser flächendeckend ausgerollt sein.

1 Tag ago

Erste Entwickler-Preview von Android 16 verfügbar

Schon im April 2025 soll Android 16 den Status Plattformstabilität erreichen. Entwicklern gibt Google danach…

1 Tag ago

Kaspersky warnt vor Cyberangriff auf PyPI-Lieferkette

Die Hintermänner setzen KI-Chatbot-Tools als Köder ein. Opfer fangen sich den Infostealer JarkaStealer ein.

2 Tagen ago

Digitale Produkte „cyberfit“ machen

Vernetzte Produkte müssen laut Cyber Resilience Act über Möglichkeiten zur Datenverschlüsselung und Zugangsverwaltung verfügen.

2 Tagen ago

Google schließt schwerwiegende Sicherheitslücken in Chrome 131

Das jüngste Update für Windows, macOS und Linux stopft drei Löcher. Eine Anfälligkeit setzt Nutzer…

2 Tagen ago