28.5 Monitoringprogramme 

Seit Java 5 und Java 6 sind im bin-Ordner einer JDK-Installation Programme hinzugekommen, die die gestarteten Java-Programme auflisten und gezielte Anfragen erlauben. Wie andere Dienstprogramme, dokumentiert Sun die Programme unter http://tutego.com/go/tools. Zwei Webseiten mit Beschreibungen einiger Tools sind http://tutego.com/go/observer und http://tutego.com/go/heap.
28.5.1 jps 

Das Programm jps ist das »Java Virtual Machine Process Status Tool« und liefert alle laufenden Java-Programme mit einem lokalen VM-Identifizierer.
C:\Programme\Java\jdk1.6.0\bin>jps -l
2032 sun.tools.jps.Jps
3728
2460 C:\Programme\Eclipse\eclipse32\startup.jar
Die Option -l zeigt den Paketnamen an. Die weitere Option -m zeigt Argumente der main()-Funktion. In dieser Sitzung ist die ID von Eclipse 2460. Die folgenden Beispiele nutzt die ID für zusätzliche Anfragen.
28.5.2 jstat 

Mit jstat, dem »Java Virtual Machine Statistics Monitoring Tool«, ist es möglich, Performance-Statistiken zu erfragen.
C:\Programme\Java\jdk1.6.0\bin>jstat -gcutil 2460
S0 S1 E O P YGC YGCT FGC FGCT GCT
0,00 0,00 0,14 38,88 99,64 299 2,682 107 55,371 58,053
Die Ausgaben zeigen zum Beispiel mit FGC die Anzahl der GC-Ereignisse an.
28.5.3 jmap 

Das Tool »Memory Map«, jmap, zeigt eine Liste mit der Anzahl der Exemplare von Java-Objekten und wie viel Hauptspeicher sie verbrauchen.
C:\Programme\Java\jdk1.6.0\bin>jmap -histo 2460
num #instances #bytes class name
--------------------------------------
1: 88096 13401560 <constMethodKlass>
2: 88096 7055480 <methodKlass>
3: 145875 6878904 <symbolKlass>
4: 70039 6100016 [C
5: 8568 5586736 <constantPoolKlass>
6: 8568 3901512 <instanceKlassKlass>
7: 7501 3419840 <constantPoolCacheKlass>
8: 9016 2093560 [B
9: 67391 1617384 java.lang.String
10: 11009 1247312 [I
11: 3435 1147928 [Ljava.util.HashMap$Entry;
...
3819: 1 8 org.eclipse.core.internal.expressions.TypeExtension$1
3820: 1 8 org.eclipse.jdt.launching.StandardSourcePathProvider
Total 707359 60781592
28.5.4 jstack 

Das Stack-Trace-Programm jstack zeigt laufende Threads an zusammen mit Informationen über den durch Monitore erzwungenen Wartezustand. Ein Ausschnitt für die Eclipse-Threads:
C:\Programme\Java\jdk1.6.0\bin>jstack 2460
2006-08-01 21:19:38
Full thread dump Java HotSpot(TM) Client VM (1.6.0-rc-b92 mixed mode, sharing):
"CompilerThread0" daemon prio=10 tid=0x02b08000 nid=0x8b0 waiting on condition
[0x00000000..0x02dbf61c]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x02b01800 nid=0xfd0 in Object.wait() [0x02ccf000.
.0x02ccfa94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
– waiting on <0x17d102b0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
– locked <0x17d102b0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
"main" prio=6 tid=0x00386000 nid=0x8d4 runnable [0x003ef000..0x003efe5c]
java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
at org.eclipse.swt.widgets.Display.sleep(Display.java:3736)
...
"VM Thread" prio=10 tid=0x02af3c00 nid=0xb04 runnable
"VM Periodic Task Thread" prio=10 tid=0x02b27800 nid=0x16c waiting on condition
JNI global references: 1307