23.3 Die Java-Laufzeitumgebung
Der Java-Interpreter java führt den Java-Bytecode in der Laufzeitumgebung aus. Dazu sucht der Interpreter in der als Parameter übergebenen Klassendatei nach der speziellen statischen main(String[])-Methode. Der allgemeine Aufruf ist:
$ java [ Optionen ] Klassenname [ Argumente ]
Ist die Klasse in einem Paket deklariert, muss der Name der Klasse voll qualifiziert sein. Liegt die Klasse Main etwa im Paket com.tutego, also im Unterverzeichnis com/tutego, muss der Klassenname com.tutego.Main lauten. Die Laufzeitumgebung muss die benötigten Klassen finden können. Die JVM wertet wie der Compiler die Umgebungsvariable CLASSPATH aus und erlaubt die Angabe des Klassenpfades durch die Option -classpath.
23.3.1 Schalter der JVM
Diverse Schalter sind bei der Laufzeitumgebung möglich:
[»] Hinweis
Je länger es die JVM von Oracle gibt, desto länger wird die Liste der Optionen. Die Standarddokumentation der JVM unter http://docs.oracle.com/en/java/javase/14/docs/specs/man/java.html listet alle Optionen kurz auf.
Class-Path-Wildcard
Die Option -cp erweitert den Klassenpfad durch Java-Archive (.jar-Dateien) und einzelne Klassendateien (.class-Dateien). Der Class-Path-Wildcard * erlaubt eine noch einfachere Angabe von Java-Archiven. Es empfiehlt sich, die Angaben in Anführungszeichen zu setzen, damit die Shell keine Expansionen vornimmt – es sei denn, das ist gewünscht.
[zB] Beispiel
Füge log.jar und alle Java-Archive im Verzeichnis lib dem Klassenpfad hinzu:
$ java -cp "log.jar;lib/*" MainClass
$ java -cp "log.jar:lib/*" MainClass
Windows trennt Pfadangaben mit einem Semikolon, und Unix trennt sie mit einem Doppelpunkt.
Zusatzoptionen
Mit der Option -X lassen sich weitere Schalter setzen und dann der Laufzeitumgebung Zusatzanweisungen geben, etwa über den maximal zu verwendenden Speicher. Ein interessanter Schalter ist –XshowSettings, der die Zustände der Standardeigenschaften ausgibt. Das ist sehr nützlich, um etwa abzulesen, welche Pfade gesetzt sind. Angewendet auf das Quadratprogramm aus Kapitel 1, »Java ist auch eine Sprache«, ergibt sich dann:
$ java -XshowSettings Quadrat
VM settings:
Max. Heap Size (Estimated): 884.00M
Ergonomics Machine Class: client
Using VM: Java HotSpot(TM) 64-Bit Server VM
Property settings:
awt.toolkit = sun.awt.windows.WToolkit
file.encoding = Cp1252
file.encoding.pkg = sun.io ...Locale settings:
default locale = Deutsch
default display locale = Deutsch (Deutschland)
default format locale = Deutsch (Deutschland)
available locales = , ar, ar_AE, ar_BH, ar_DZ, ar_EG, ar_IQ, ar_JO,
ar_KW, ar_LB, ar_LY, ar_MA, ar_OM, ar_QA, ar_SA, ar_SD,
...
Quadrat(1) = 1
Quadrat(2) = 4
Quadrat(3) = 9
Quadrat(4) = 16
[»] Hinweis
Neben den einfachen -X-Optionen gibt es weitere spezielle HotSpot-Optionen, die mit -XX gesetzt werden. Zunächst müssen sie mit -XX:+UnlockDiagnosticVMOptions freigeschaltet werden. Dann lässt sich zum Beispiel mit -XX:+PrintAssembly[ 289 ](https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly) der von HotSpot generierte Assemblercode ausgeben (allerdings nur, wenn die hsdis-i386.dll im Pfad ist).
23.3.2 Der Unterschied zwischen java.exe und javaw.exe
Unter einer Windows-Installation gibt es im Java-JDK für den Interpreter zwei ausführbare Dateien: java.exe und javaw.exe, wobei meistens java.exe zum Einsatz kommt. Der Unterschied besteht darin, dass eine über die grafische Oberfläche gestartete Applikation mit java.exe im Unterschied zu javaw.exe ein Konsolenfenster anzeigt. Ohne Konsolenfenster sind mit javaw auch keine Ausgaben über System.out/err zu sehen.
In der Regel nutzt ein Programm mit grafischer Oberfläche während der Entwicklung java und im Produktivbetrieb dann javaw.