Referenzen und die Speicherverwaltung in Java
Der Speicher des Computers besteht aus Teilen, die von vorhandene Objekte belegt sind und daher nur durch diese Objekte verwendet werden dürfen, und aus Teilen, die derzeit nicht verwendet werden, und daher für die Verwendung durch neue Objekte frei sind.
In dem folgenden Programmfragment wird ein neues Objekt angelegt und seine Referenz in der Variablen x gespeichert. Dann wir dasselbe noch einmal wiederholt. Dadurch geht die erste Referenz verloren. Das erste Objekt existiert noch, aber es kann nicht mehr erreicht werden. Blockiert es jetzt nicht unnötigerweise Speicherplatz? Nein, denn Java findet solche unerreichbaren Objekte automatisch und gibt ihren Speicher zur erneuten Verwendung frei.
x = new java.lang.Object();
x = new java.lang.Object();
In der folgenden Endlosschleifen werden immer wieder neue Objekte im Speicher angelegt, aber da die nicht erreichbaren Objekte automatisch wieder freigegeben werden, wird der Speicher nie voll.
while( true )x = new java.lang.Object();
Ein Objekt wird gelöscht (also zur Wiederverwendung seines Speichers freigegeben), nachdem es nirgendwo mehr eine Referenz auf das Objekt gibt. Um dies zu erreichen, gibt es keinen speziellen Aufruf. Der Programmierer muß vielmehr darauf achten, daß keine Variable mehr eine Referenz auf dieses Objekt enthält.
Bei Namen mit Blockgültigkeitsbereich kann das Objekt zum Löschen freigegeben werden, wenn der Gültigkeitsbereich endet (falls sonst keine Referenz auf das Objekt kopiert wurde).
{ final java.lang.Object x = new java.lang.Object(); } /* hier ist das Objekt freigegeben */
Wenn eine Referenz auf ein Objekt nur in einer Variablen »x« gespeichert ist, dann wird das Objekt zum Löschen freigegeben, sobald die Variable mit einem neuen Wert beschrieben ist, beispielsweise auf die folgende Weise:
x = null;
Ein Speicherleck kann entstehen, wenn eine Referenz auf ein Objekt noch irgendwo gespeichert ist, obwohl dieses Objekt im weiteren Verlaufe des Programms vorhersehbar nicht mehr verwendet werden soll. Dann wird der Speicherplatz für das Objekt nicht freigegeben geht somit für die anderen Objekte verloren.
Wann genau ein einst von einem Objekt belegte und nun freigegebener Speicher für etwas anderes wiederverwendet wird, kann man nicht genau sagen.
Objekte haben unterschiedliche Speichergröße, während alle Referenzen gleich groß sind. Eine Variable für ein Objekt eines unbestimmten Typs ist also nicht direkt möglich, da dann nicht bekannt wäre, welche Größe diese Variable haben sollte. Daher enthalten Variablen keine Objekte, sondern immer nur Referenzen.