» Tutorial / Java Grundlagen / dynamische Speicherverwaltung

Dieses Kapitel soll noch einmal detaillierter auf das Speichermanagement von Java eingehen. Wir werden die wesentliche Punkte kurz und knapp zusammentragen.


» Garbage Collector nach oben «

Java verwaltet den dynamischen Arbeitsspeicher vollkommen selbständig. Der Programmierer muss nicht Sorge für die Allokation und korrekte Freigabe des Speichers tragen. Realisiert wird dies über einen speziellen Prozess, der ständig im Hintergrund der JVM mitläuft. Er prüft, ob ein Objekt noch länger verwendet wird und gibt dessen allokierten Speicherbereich gegebenenfalls frei.

An dieser Stelle gilt es zu unterscheiden. Java behandelt lokale Variablen und Klassenobjekte differenziert. Dazu kommen wir allerdings noch in den folgenden Punkten. Der Garbage Collector gibt den Speicher allerdings nur in gewissen Intervallen frei, also wenn er als niedrig laufender Prozess entscheidet. Daher kann es zu Verzögerungen kommen, wenn Objekte bereits nicht mehr verwendet werden. Es besteht aber auch die Möglichkeit, diesen Prozess über das System direkt aufzurufen.


» Datentypen nach oben «

In der Java - Sprachspezifikation haben alle acht elementaren Datentypen eine feste Bytegröße. Für die Speicherverwaltung hat dies eine wichtige Bedeutung. Durch die festen Wertebereiche ist eine vollständige Typsicherheit auf nahezu allen Betriebssytemen gewährleistet. Auch der Speicherverbrauch läßt sich so gut abschätzen.

Die folgende Tabelle beinhaltet noch einmal alle elementaren Datentypen und ihre Bytegröße im Speicher. Ausgenommen sind hier die benutzerdefinierten Datentypen (Klassen), da diese einer speziellen Betrachtung obligen.

Typ Byte
   
boolean1
char 2
byte 1
short 2
int 4
long 8
float 4
double 8

» Variablen nach oben «

An dieser Stelle sollen uns lediglich die lokalen Variablen interessieren, ausgenommen die Datenelemente in einer benutzerdefinierten Klasse. Diese werden häufig in lokalen Blöcken für kleine Arbeiten wie die Zwischenspeicherung von temporären Werten eingesetzt.

In Java werden lokale elementare Variablen auf dem sogenannten Stackspeicher angelegt. Dabei handelt es sich um einen LIFO (Last In First Out) - Speicher. Das heißt, dass das letzte Element, welches auf den Speicher aufgelegt wird, auch wieder als erstes entnommen wird. Wenn wir nun die Sichtbarkeit von lokalen Variablen betrachten, so wissen wir, dass diese nur innerhalb ihres Blocks gültig sind. Wird dieser velassen, so wird immer die letzte angelegte Variable zerstört. Die folgende Grafik zeigt das Prinzip eines Stacks auf.

Prinzip eines Stack


» Klassen nach oben «

Klassen, beziehungsweise deren Instanzen, werden prinzipiell auf dem dynamischen Arbeitsspeicher angelegt. Das hängt damit zusammen, dass in Java alle Programmelemente in Klassen verpackt werden und deren Anzahl von elementaren Datenelementen recht groß ist, so dass der Stack allein nicht ausreicht.

Die Bytegröße einer Klasse ergibt sich immer aus der Summe aller beinhalteten Variablen und ihres Datentyps. Hier müssen wir noch eine weitere Unterscheidung treffen. Die hier als Datenelemente bezeichneten Variablen sind die Elemente, welche fest zur Funktion der Klasse gehören, sprich deren Daten speichern. Diese sind im Hauptblock der Klasse definiert. Alle anderen, sich in Unterblöcken befindlichen Variablen werden in der Regel lokal auf dem Stack zwischengespeichert. Ausnahmen bilden hier die inneren Klassen und andere benutzerdefinierte Klassen, welche als Variable instanziiert werden.

Daten auf dem Stack werden automatisch freigegeben, sobald sie ihren Gültigkeitsbereich verlassen. Die Freigabe von Klassenobjekten hingegen wird vom Garbage Collector überwacht und durchgeführt.


» New nach oben «

Der Weg auf dem Objekte dynamisch angelegt werden, führt am New - Operator vorbei. Dieser erzeugt eine neue Klasseninstanz und weist dessen Adresse einer Referenzvariable zu. Über diesen benannten Bezeichner wird dann das Objekt mit seinen Elementen referenziert. Wir wollen hier kein neues Beispiel angeben, da wir in den vergangenen Kapitel die Instanziierung bereits detailliert verwendet haben.


« Kapitel Kapitelübersicht nach oben Kapitel »