07.04.01 java/javaw – Programme ausführen

Sie kennen bereits den Befehl java um eine kompilierte Class-Datei mit Main-Methode auszuführen. Auch wissen Sie schon, wie Sie den Classpath beim Ausführen eines Programms setzen. In diesem Kapitel lernen Sie weitere Parameter und das Programm javaw (welches nicht auf allen Plattformen zur Verfügung steht) kennen.

Bevor wir uns den Parametern widmen, werfen wir zuerst einen Blick auf das Programm javaw. Dieses kleine Tool finden Sie – sofern unterstützt – ebenso wie java im bin-Verzeichnis Ihrer JRE.

Unter Windows wäre dies z. B. C:\Programme\Java\jre6\bin\java.exe bzw. C:\Programme\Java\jre6\bin\javaw.exe.

Im Prinzip ist der javaw-Aufruf der java-Aufruf ohne Konsole und eignet sich folglich für Hintergrundprozesse oder grafische Programme. Sie können also mit „javaw“ genauso Java-Programme starten wie mit „java“. Der Unterschied liegt darin, dass Sie die Konsole nach Aufruf von „javaw“ wieder schließen können, ohne das Programm zu beenden. Schließen Sie die Konsole nach einem „java“ Aufruf, wird Ihr Programm auch gleichzeitig mit beendet. Da „javaw“ auf die Konsole verzichten kann, werden auch keine System.out.println oder System.err.println ausgegeben.

Bei jedem Aufruf von „java“ oder „javaw“ wird eine neue Java VirtualMachine (JVM) gestartet, die für die Ausführung Ihres Java-Programms zuständig ist.

Java HotSpot VM

In diesem Kapitel werden Sie oft etwas von „Kompilieren“ und „Java HotSpot VM“ oder ähnlichem lesen. Hiermit ist aber nicht das standardmäßige Kompilieren von Java-Quellcode in Java-Bytecode gemeint, weshalb ich Ihnen zuerst kurz und knackig erkläre, was es damit auf sich hat:

Bei der Standard-VirtualMachine, die für die Ausführung Ihrer Programme und Klassen zuständig ist, ist eine so genannte „Java HotSpot VM“ integriert. Diese kompiliert den Byte-Code zur Laufzeit in Maschinencode und sorgt damit für einen Geschwindigkeitsschub. Wenn in diesem Kapitel also vom Kompilieren geredet wird, ist damit das Kompilieren von Byte-Code in Maschinencode gemeint.

Parameter/Optionen

Verschaffen wir uns nun einen groben Überblick (die wichtigeren Optionen werden auch detaillierter besprochen), über die verfügbaren Standard-Optionen.

Beachten Sie, dass alle Optionen zwischen dem Wörtchen „java“ und dem Klassennamen stehen müssen. Alles nach dem zu ladenden Klassennamen wird dieser Klasse als Argument übergeben. Klassennamen werden grundsätzlich ohne .class am Ende eingegeben und Package-Namen werden über den Punkt „.“ kenntlich gemacht.

java [Optionen] Klassenname [Argumente]

Befehl Beschreibung
-cp, -classpath Setzt den Classpath, siehe Kapitel 07.03 Einbinden von externen Klassen – Classpath.
-client Verwenden der Java Client HotSpot Virtual Machine (Standard).
-server Verwenden der Java Server HotSpot Virtual Machine.
-Deigenschaft=wert Setzt eine Eigenschaft, oder auch Property, die später bspw. über System.getProperty abgefragt werden kann. Weitere, relativ häufige Einsatzgebiete: Das Programm auf diesem Weg für den Betrieb auf einem Server ohne Grafikkarte zu konfigurieren (java -Djava.awt.headless=true my.headless.ClassFile), oder das LookAndFeel zu setzen (java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel my.laf.ClassFile).
-ea, -enableassertions Erlaubt die Verwendung von Assertions.
-da, -disableassertions Verbietet die Verwendung von Assertions.
-esa, -enablesystemassertions Erlaubt die Verwendung von Assertions in allen System-Klassen.
-dsa, -disablesystemassertions Verbietet die Verwendung von Assertions in allen System-Klassen.
-jar Führt ein JAR-File aus, siehe Kapitel 07.04.04 jar.
-verbose:class Zeigt Informationen über jede geladene Klasse an. Erstellen Sie sich ein einfaches HelloWorld-Programm und führen Sie es mit dieser Option aus. Sie werden eine Vielzahl an Informationen über die geladenen Klassen wie z. B. diese hier erhalten:

...
[Loaded sun.reflect.misc.ReflectUtil from shared objects file]
[Loaded java.io.FilterOutputStream from shared objects file]
[Loaded java.io.PrintStream from shared objects file]
[Loaded java.io.BufferedOutputStream from shared objects file]
...
-verbose:gc Informiert über jedes Event des GarbageCollectors (siehe Kapitel 07.09 GarbageCollector). Die Ausgabe sieht in etwa so aus:

[GC 896K->241K(5056K), 0.0047166 secs]
[GC 1137K->381K(5056K), 0.0033075 secs]
[GC 1277K->578K(5056K), 0.0034377 secs]
[GC 1474K->694K(5056K), 0.0024411 secs]
-verbose:jni Berichtet über Aktivitäten mit dem Java Native Interface. Beispiele:

Registrieren von nativen Methoden:

[Registering JNI native method java.lang.Compiler.compileClass]
[Registering JNI native method java.lang.Compiler.compileClasses]
[Registering JNI native method java.lang.Compiler.command]

Dynamisches linken zu nativen Methoden:

[Dynamic-linking native method sun.misc.VM.initialize ... JNI]
[Dynamic-linking native method java.lang.Runtime.maxMemory ... JNI]
[Dynamic-linking native method java.lang.System.setOut0 ... JNI]
-version Zeigt die Version der JRE an.
-?, -help Zeigt Informationen über die verfügbaren Optionen an.
-X Listet die Nicht-Standard-Optionen auf.

Zusätzlich zu den genannten Standard-Optionen gibt es noch nicht standardmäßige Optionen. Diese Optionen müssen nicht (je nach verwendeter VirtualMachine) zwingend zur Verfügung stehen.

Befehl Beschreibung
-Xint Anwendung wird im Interpreter-Modus ausgeführt. Dies bedeutet, dass der Bytecode nicht zu nativen Code kompiliert, und der komplette Bytecode vom Interpreter ausgeführt wird. Dadurch werden Verfälschungen durch die Java HotSpot VM vermieden, aber auch der daraus resultierende Performance-Gewinn verloren.
-Xbatch Normalerweise werden Methoden im Hintergrund kompiliert und solange wie der Kompilierungsprozess noch nicht beendet wurde im Interpreter-Modus ausgeführt. Dies wird durch diese Option deaktiviert.
-Xdebug Startet das Programm mit eingeschaltetem Debugger.
-Xbootclasspath Ersetzt den eigentlichen Bootstrap-Classpath durch einen eigenen (siehe Kapitel 07.03 Einbinden von externen Klassen – Classpath).
-Xbootclasspath/a Hängt weitere Verzeichnisse und Archive an den Bootstrap-Classpath an.
-Xbootclasspath/p Stellt weitere Verzeichnisse und Archive dem Bootstrap-Classpath voran.
-Xcheck:jni Überprüft native Methoden zusätzlich u. a. in Form der übergebenen Parameter und Daten der Laufzeitumgebung.
-Xfuture Kontrolliert den zu ladenden Byte-Code strikter auf sein Format, als dies ältere Versionen der JVM machen.
-Xnoclassgc Deaktiviert den GarbageCollector für Klassen.
-Xincgc Durch die Aktivierung der inkrementellen GarbageCollection entstehen unter Umständen langsamere Ausführungszeiten, da Ressourcen ggf. früher freigegeben werden.
-Xloggc:Datei Speichert die Ausgaben von -verbose:gc in eine Datei.
-XmsWert Spezifiziert den minimal verfügbaren Arbeitsspeicher der Anwendung. Beispiel:

java -Xms128m ProgrammMit128MegaByteRAM
java -Xms131072k ProgrammMit131072KiloByteRAM
java -Xms134217728 ProgrammMit134217728ByteRAM

-XmxWert Definiert den maximal verfügbaren Arbeitsspeicher der Anwendung, siehe -Xms.
-Xprof Gibt auf der Standardausgabe ein Profiling für die gestartete Anwendung aus.
-Xrunhprof Ermöglicht ein Profiling für CPU, Heap und Monitoren. Verwenden Sie -Xrunhprof:help für die exakte Syntax.
-Xrs Reduziert die Verwendung von Systemsignalen.
-XssWert Setzt die Größe des Thread-Stacks.

2 Replies to “07.04.01 java/javaw – Programme ausführen”

  1. sparrow

    Das Programm javaw ist IMHO nur bei der Laufzeitumgebung für Windows enthalten.
    Bei Linux gibt es dieses so nicht.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.