Speicher


[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ Literaturverzeichnis ]

Übersicht: Speicher


Suns VM-Spezifikation sieht fünf verschiedene Speicherbereiche (Runtime Data Areas) vor, die vom Classloader und der Execution Engine verwendet werden und unterschiedliche Arten von Daten speichern.

Method Area

Die Method Area enthält sämtliche statischen Informationen über Klassen. Dieser Speicherbereich wird vom Classloader gefüllt, sobald eine Klasse geladen wird.
Die Informationen, die in der Method Area gespeichert werden, sind im Einzelnen für jeden Typ[1]:
All diese Daten müssen auf irgendeine Art und Weise in der Method Area vorliegen. Die konkrete Form ist jedoch auch hier dem Programmierer der VM überlassen, ebenso wie die Größe der Method Area, die sowohl festgelegt als auch dynamisch sein kann. Bei der Method Area ist darauf zu achten, dass sie pro VM-Instanz nur ein einziges Mal existiert - das heißt, bei der Implementierung ist auf Threadsicherheit zu achten, da verschiedene Threads gleichzeitig darauf zugreifen können.

Heap

Während in der Method Area statische Daten gespeichert werden, dient der Heap zur Speicherung von dynamischen Informationen über konkrete Objekte. Für jedes Objekt sind dies sämtliche Instanzvariablen - sowohl die, die in seiner eigenen Klasse deklariert wurden, als auch die aus sämtlichen Vorfahren dieser Klasse.
Desweiteren beinhaltet der Heap für jedes Objekt eine Referenz auf den zugehörigen Eintrag in der Method Area. Auch der Heap existiert nur einmal pro Instanz der VM.

Java-Stack

Der Java-Stack speichert lokale Variablen innerhalb von Methodenaufrufen, sowie Operanden für arithmetische Operationen. Bei jedem Methodenaufruf wird ein Stack-Frame auf den Stack gepusht, der Platz für die lokalen Variablen dieser Methode und einige Zusatzdaten bietet. Wird die Methode (durch return oder durch eine Exception) verlassen, wird der zugehörige Frame wieder vom Stack genommen. Jeder Thread hat seinen eigenen Java-Stack.
Auf jedem Stackframe liegen folgende Informationen:

Program-Counter

Der Program-Counter (PC) ist das einzige Register, welches die VM-Spezifikation vorsieht. Seine Funktion ist selbsterklärend: Im PC ist jeweils die Adresse des aktuell ausgeführten Befehls abgelegt. Es ist nicht festgelegt, ob diese Adresse als Offset relativ zum Methodenanfang oder als absolute Speicheradresse vorliegt - auch dies ist abhängig von der konkreten Implementierung.
Wird keine Java-, sondern eine native Methode ausgeführt, ist der Wert des PC undefiniert.
Natürlich gibt es auch vom PC ein Exemplar pro Thread.

Stack für native Methoden

Der Stack für native Methoden erfüllt die gleiche Aufgabe wie der Java-Stack, allerdings für native Funktionsaufrufe. Entsprechend ist sein Aussehen je nachdem, welche Bibliotheken man als Schnittstelle zum Betriebssystem verwendet - und auch je nach Betriebssystem - unterschiedlich.
[1] Unter 'Typ' werden im Folgenden Klassen und Interfaces verstanden.
[2] Der Java-Bytecode ist dahingehend optimiert, dass er für den Zugriff auf die lokalen Variablen mit niedrigem Index jeweils eigene Load- und Store- Instruktionen hat. Die Instruktion iload_1 benötigt also keine Parameter und ist nur ein Byte groß. Nur für Variablen mit hohem Index, die seltener verwendet werden, benötigt man zwei Byte (iload_n mit dem Index als Parameter)
[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ oben ] ... [ weiter ] ... [ Literatur ]