Java Virtual Machine (JVM) durch Java-Interpreter (java) realisiert abstrakte Maschine = Softwareschicht zwischen Anwendung und Betriebssystem verantwortlich für Laden von Klassen, Ausführen des Bytecodes, Speicherverwaltung Basis für Portabilität und Sicherheit ex. Spezifikation und verschiedene Implementierungen Bytecode Maschinensprache der JVM portables (HW- und BS-unabhängiges) Binärformat EinfProg 50
Aufbau der JVM Systemklassenlader Klassenlader Bytecode- Verifier Method Area (Klassen) Heap Stacks (1 pro Thread) Ausführungsmaschinen (1 pro Thread) Access Controller Betriebssystem EinfProg 51
Speicherbereiche Method Area enthält Programmcode, Konstanten, Klassenvariablen auf dem Stack werden bei jedem Methoden- bzw. Blockaufruf die lokalen Variablen abgelegt - werden am Ende der Methode vom Stack entfernt (LIFO) - enthält auch Verweis auf zugehörige Klasse (indirekt), Rücksprungadresse, Hilfsvariablen für Berechnungen der JVM auf dem Heap (Halde) werden Objekte, z.b. Arrays abgelegt - bei new sucht JVM Speicherplatz ausreichender Größe - Objekte existieren methodenübergreifend EinfProg 52
Rückblick: Call-by-Value formaler Parameter entspricht lokaler Variable, die mit Wert des aktuellen Parameters initialisiert wird Konsequenz: formaler Parameter darf verändert werden, aber Änderungen gehen bei Verlassen der Methode verloren public static void main(string[] args) { int i=1; m(i); Out.println(i); // liefert 1 static void m(int k) { ++k; Out.println(k); // liefert 2 Call-by-Value-Result (Ada): Methodenaufruf wie Call-by-Value, bei Verlassen Methode wird Wert zurückkopiert in aktuellen Parameter EinfProg 53
Call-by-Reference Parameterübergabe-Mechanismus, z.b. in Modula (nicht Java) formaler Parameter entspricht lokaler Variable, in der Adresse des aktuellen Parameters steht (muss Variable sein) jede Änderung der lokalen Variable verändert direkt den aktuellen Parameter public static void main(string[] args) { int i=1; m(i); Out.println(i); // liefert 2 static void m(var int k) { ++k; // verändert i Out.println(k); // liefert 2 EinfProg 54
Arrays als Parameter verwendet Call-by-Value, aber Effekt ähnelt Call-by-Reference aktueller / formaler Parameter = Verweis auf Array wird in lokaler Variable abgespeichert Änderungen dieser Variable ändern außen nichts Änderungen am Array selbst wirken auch außen public static void main(string[] args) { int [] a = new int[5]; m(a); Out.println(a[3]); // liefert 5 static void m(int[] b) { b[3] = 5; b = new int[10]; b[3] = 7; EinfProg 55
Zeiger vs. Verweise Zeiger (Pointer) = Adresse im Speicher Verweis (Referenz, Reference) = Erreichbarkeitsinformation C verwendet Zeiger Adressarithmetik möglich Java verwendet Verweise, z.b.: a Stack interne Tabelle Heap Konsequenz: Arrays können im Heap verschoben werden, ohne die Einträge auf dem Stack (beliebig viele) zu aktualisieren EinfProg 56
Garbage Collector niedrigpriorisierter Hintergrund-Thread zur automatischen Freigabe unerreichbarer Objekte (Arrays) Garbage Collector darf Objekte verschieben (hilft gegen Speicherfragmentierung) Objekt ist unerreichbar, wenn es keine Verweiskette von Stack (oder Method Area) zu Objekt mehr gibt Objekt kann unerreichbar werden durch - Verlassen eines Blocks Freigabe von lokalen Variablen - Zuweisungen: b = new int[10]; b = null; - Unerreichbarkeit eines Vorgängerobjekts (Liste) expliziter Aufruf durch System.gc(); EinfProg 57
Kommandozeilenparameter java MyProgramm hallo donnerstag 9 Betriebssystem ruft Java-Interpreter (java) auf und übergibt Parameter: MyProgramm hallo donnerstag 9 Java-Interpreter ruft main-methode auf und übergibt Parameter als Array: [ "hallo", "donnerstag", "9"] public static void main(string[] args) { Out.println(args[0] + " Heute ist " + args[1] + " der " + args[2] + "-te"); int i = Integer.parseInt(args[2]); Out.println(" und morgen der " + (i+1) + "-te"); EinfProg 58