Das Ergebnis dieses Beispiels ist leicht vorhersagbar: Auf dem Testrechner ging dem Programm nach ungefähr neun Blöcken der Speicher aus, wie man in Abbildung A sehen kann.
Wichtig in Abbildung A ist, dass der Garbage Collector die MemoryBlocks nicht zurückfordern konnte um den von ihnen belegten Speicherplatz wieder freizugeben, da sie in einer ArrayList gespeichert waren. Aus diesem Grund sind auch keine Mitteilungen vorhanden, aus denen ersichtlich wäre, dass MemoryBlock.finalize aufgerufen worden sei.
Und nun ein Blick auf Listing C. Hier sind die MemoryBlocks in der ArrayList über Instanzen der MyReference-Klasse gespeichert, die in Listing D zu finden ist. MyReference erweitert SoftReference und setzt die toString-Methode außer Kraft, um eine String-Darstellung des Objekts zurückzugeben, auf das die Klasse eine schwache Referenz hält.
Abbildung B zeigt die Ausgabe des abgeänderten Beispiels. Dem Programm geht nach ungefähr der gleichen Anzahl von Iterationen der Speicher aus, da aber nur Referenzen über die Referenzobjekte zu den MemoryBlocks bestehen, können sie mit dem Garbage Collector zurückgefordert werden, wenn der Speicher knapp wird.
Abbildung B: Der Speicher wird noch immer knapp, aber die Garbage Collection ist klar zu erkennen. (Abbildung vergrößern)
Wie man aus den wiederholten finalize-Meldungen erkennen kann, sind alte Blöcke freigegeben, während neue erstellt werden. Die Referenzobjekte, die sich auf die erledigten MemoryBlocks beziehen, werden auch gelöscht. Aus diesem Grund werden ihre entsprechenden Positionen auf der ArrayList als null ausgedruckt. Man sieht, dass die MyReference-Instanzen noch immer existieren, nur verweisen sie nicht mehr auf die MemoryBlocks, da diese bereits entsorgt wurden.
Ein viel höheres Maß an KontrolleWie man sieht, bieten Referenzobjekte eine wesentlich bessere Kontrolle über den Speicherbereinigungsprozess. Bei ihrer Anwendung genießt man trotzdem die Vorzüge der automatischen Speicherbereinigung, insbesondere deren einfache Anwendung und Sicherheit.
Neueste Kommentare
Noch keine Kommentare zu Effektive Speicherverwaltung mit Javas Referenzobjekten
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.