Linkertechniken


... [ Seminar WWW und JAVA] ... [ Thema Java Virtual Machine ] ... [ Compilertechniken ] ...

Übersicht: Linkertechniken


Grober Ablauf

Überblick Aufbau der JVM


Überlick: Start-up der Virtual Machine


Laden des Codes

Laden bezeichnet den Prozess die binäre Form einer bestimmten Klasse oder Schnittstelle zu finden und der JVM zur Verfügung zu stellen.

Die binäre Form einer Klasse oder Schnittstelle liegt im Class Dateiformat vor.

Der Ladeprozeß ist in der Klasse ClassLoader und deren Subklassen implementiert. Es gibt verschiedene Subklassen, in denen verschiedene Ladestrategien implementiert sind. z.B. Laden über ein Netzwerk NetworkClassLoader bzw. AppletClassLoader (Netscape)


Linking

Linking bezeichnet das Integrieren einer Klasse oder Schnittstelle in die Laufzeitumgebung der Java Virtual Machine.

Das Linken besteht aus den drei Aktivitäten:

  1. Überprüfung: siehe Bytecode Verifier
  2. Vorbereitung: Beinhaltet das Anlegen der Klassenvariablen static int a;
    Diese werden mit Standard-Werten gefüllt z.B.:
  3. Auflösung der symbolischen Referenzen
    Wann die Referenzen überprüft werden, ist abhängig von der Implementierung:
    Referenzen werden entweder an dieser Stelle oder erst bei ihrer direkten Benutzung überprüft. Dies wird auch als "lazy resolution" bezeichnet.
    Bevor eine Referenz benutzt werden kann, muß überprüft werden, ob sie gültig ist.


Initialisierung

Initialisierung der Klassenvariablen, z.B. int a = 10;
Bevor eine Klasse initialisiert werden kann, muß ihre Superklasse initialisiert werden.
Jedem Objekt ist ein Status zugeordnet, der den Stand der Initialisierung anzeigt: Ausserdem ist jedem Objekt ein Lock zugeordnet(siehe Multithreading).

Ablauf Initialisierung

Die Initialisierung sieht im Detail wie folgt aus:

Beispiel für eine mögliche Rekursion bei der Initialisierung

class a {
	static int	x = b. getx();

}

class b extends a{

	public int 	getx() { ... }

}


Erstellung einer Klasseninstanz

. . . MyClass x = new MyClass (); . . .


Finalization einer Klasseninstanz

class MyClass{
	.
	.
	.
	void finalize() {
		// Aufräumen z.B. Schließen von Dateien
		.
		.
		.
	}
}

Da nicht sicher ist, wann eine finalize-Methode vom Garbage Collector ausgeführt wird, sollte sie nicht dazu genutzt werden, um ein mehrmals benötigten Filedeskriptor freizugeben, da es bei einem erneuten Zugriff auf die gleiche Datei zu einem Fehler führen kann, wenn der Finalizer noch nicht ausgeführt wurde.


Beenden der Virtual Machine

Die JVM wird beendet, wenn eine der folgenden Ereignisse eintritt:


Datenstrukturen zur Laufzeit

Datenstrukturen


Referenzierung von Methoden

int add12and13() {
	return addTwo(12,13);
}


Method int add12and13()
	aload_0		 // Lädt lokale Variable 0 (this) auf den Stack
	bipush 12	 // lädt int 12 auf den Stack
	bipush 13	 // lädt int 13 auf den Stack
	invokevirtual #4 // Ruft die Methode Example.addTwo(II)I
	ireturn		 // Gib int vom Stack als Returnwert zurück

Es wird der 4. Eintrag im Constant Pool referenziert der vom Typ CONSTANT_Methodref (10) sein muß.

Der Klassenname in Java muß den voll qualifizierten Klassenpfad enthalten.
Beispiel für Klassenpfad: java/lang/String

Anhand dieser Daten wird der Code der Methode in der Code-Tabelle gefunden und ausgeführt.


Referenzierung von Konstanten

Konstanten werden mit Hilfe von ldc geladen.

int i = 100000;


	ldc #1     //lädt Konstantenwert auf Stack

Der Eintrag im Contant Pool muß vom Typ CONSTANT_Integer sein.


Referenzierung von Variablen

Instanzvariablen: getfield und putfield.
Klassenvariablen: getstatic und putstatic.
.
int i;
.
.
void setIt(int value){
	i = value;
}

Method void setIt(int) aload_0 // lädt this auf den Stack iload_1 // lädt 1. Parameter auf den Stack putfield #4 // ruft putfield mit Referenz auf Eintrag im Constant Pool ireturn // gibt int zurück

Anhand dieser Daten und this wird der Pointer auf die Variable in der Feldtabelle gefunden.


... [ Seminar WWW und JAVA ] ... [ Thema Java Virtual Machine ] ... [ Linkertechniken ] ... [ Compilertechniken ] ...