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.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Effektive Speicherverwaltung mit Javas Referenzobjekten

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *