Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 26 Dienstprogramme für die Java-Umgebung
  Pfeil 26.1 Die Werkzeuge vom JDK
  Pfeil 26.2 Java-Compiler und Java-Laufzeitumgebung
    Pfeil 26.2.1 Bytecode-Compiler javac
    Pfeil 26.2.2 Native Compiler
    Pfeil 26.2.3 Java-Programme in ein natives ausführbares Programm einpacken
    Pfeil 26.2.4 Der Java-Interpreter java
  Pfeil 26.3 Das Archivformat Jar
    Pfeil 26.3.1 Das Dienstprogramm jar benutzen
    Pfeil 26.3.2 Das Manifest
    Pfeil 26.3.3 Applikationen in Jar-Archiven starten
    Pfeil 26.3.4 Applets in Jar-Archiven
  Pfeil 26.4 Monitoringprogramme
    Pfeil 26.4.1 jps
    Pfeil 26.4.2 jstat
    Pfeil 26.4.3 jmap
    Pfeil 26.4.4 jstack
    Pfeil 26.4.5 VisualVM
  Pfeil 26.5 Ant
    Pfeil 26.5.1 Bezug und Installation von Ant
    Pfeil 26.5.2 Das Build-Skript build.xml
    Pfeil 26.5.3 Build den Build
    Pfeil 26.5.4 Properties
    Pfeil 26.5.5 Externe und vordefinierte Properties
    Pfeil 26.5.6 Weitere Ant-Tasks
  Pfeil 26.6 Weitere Dienstprogramme
    Pfeil 26.6.1 Sourcecode Beautifier
    Pfeil 26.6.2 Java-Programme als Systemdienst ausführen
  Pfeil 26.7 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

26.4 Monitoringprogramme  Zur nächsten ÜberschriftZur vorigen Überschrift

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


Rheinwerk Computing - Zum Seitenanfang

26.4.1 jps  Zur nächsten ÜberschriftZur vorigen Überschrift

Das Programm jps ist das »Java Virtual Machine Process Status Tool« und liefert alle laufenden Java-Programme mit einem lokalen VM-Identifizierer:

c:\Program Files\Java\jdk1.6.0\bin>jps
7344 Jps
7544 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

Läuft nur Eclipse, dann zeigt die Ausgabe zwei Programme; jps selbst ist auch in der Liste. In dieser Sitzung ist die ID von Eclipse 7544. Die folgenden Beispiele nutzen die Eclipse-ID für zusätzliche Anfragen.

Eine Option -l listet den Paketnamen mit auf. Die weitere Option -m zeigt die an die main()-Methode übergebenen Argumente an.


Rheinwerk Computing - Zum Seitenanfang

26.4.2 jstat  Zur nächsten ÜberschriftZur vorigen Überschrift

Mit jstat, dem »Java Virtual Machine Statistics Monitoring Tool«, ist es möglich, Performance-Statistiken zu erfragen:

c:\Program Files\Java\jdk1.6.0\bin>jstat -gcutil 7544
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0,00   0,00   0,67  48,20  99,51     28    0,379    18    4,931    5,310

Die Ausgaben zeigen zum Beispiel mit FGC die Anzahl der GC-Ereignisse an. Die ID 7544 erfahren wir vom Tool jps.


Rheinwerk Computing - Zum Seitenanfang

26.4.3 jmap  Zur nächsten ÜberschriftZur vorigen Überschrift

Das Tool »Memory Map«, jmap, zeigt eine Liste mit der Anzahl der Exemplare von Java-Objekten und wie viel Hauptspeicher sie verbrauchen. Für Eclipse ist die Anzahl der Objekte sehr groß, sodass die Ausgabe gekürzt ist:

c:\Program Files\Java\jdk1.6.0\bin>jmap -histo 7544

 num     #instances         #bytes  class name
----------------------------------------------
   1:        100113       15501408  <constMethodKlass>
   2:        164153       10546920  [C
   3:        173399        8861896  <symbolKlass>
   4:        100113        8020224  <methodKlass>
   5:          9670        6380680  <constantPoolKlass>
   6:          9670        4443440  <instanceKlassKlass>
   7:        159802        3835248  java.lang.String
   8:          7966        3714800  <constantPoolCacheKlass>
   9:         10287        2334824  [B
  10:          6132        1747920  [Ljava.util.HashMap$Entry;
  11:         67824        1627776  java.util.HashMap$Entry
...
4685:             1              8  org.eclipse.core.internal.expressions.
                                    StandardElementHandler
4686:             1              8  com.ibm.icu.text.RuleBasedCollator$DataManipulate
Total       1051806       78213168

Rheinwerk Computing - Zum Seitenanfang

26.4.4 jstack  Zur nächsten ÜberschriftZur vorigen Überschrift

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:\Program Files\Java\jdk1.6.0\bin>jstack 7544
2010-08-17 09:51:01
Full thread dump Java HotSpot(TM) Client VM (16.0-b13 mixed mode, sharing):

"Worker-6" prio=6 tid=0x01a9e800 nid=0x568 in Object.wait() [0x0474f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x126df690> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:185)
        – locked <0x126df690> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:217)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)
...
"CompilerThread0" daemon prio=10 tid=0x01aa4c00 nid=0x155c waiting Umbruch
oncondition[0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x01a9c000 nid=0xab0 waiting on condition Umbruch
[0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x01a9b800 nid=0x980 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x01a95c00 nid=0x1ef4 in Object.wait() [0x03e8f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x12510288> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        – locked <0x12510288> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

...
"main" prio=6 tid=0x01a59800 nid=0x1400 runnable [0x007ff000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
        at org.eclipse.swt.widgets.Display.sleep(Display.java:4311)
        at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle( Umbruch
          WorkbenchAdvisor.java:364)
        at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2406)
...
        at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1287)

"VM Thread" prio=10 tid=0x01a8fc00 nid=0x3b8 runnable

"VM Periodic Task Thread" prio=10 tid=0x01aad800 nid=0x860 waiting on condition

Rheinwerk Computing - Zum Seitenanfang

26.4.5 VisualVM  topZur vorigen Überschrift

VisualVM ist eine grafische Oberfläche mit einfachen Profiling-Möglichkeiten und einer grafischen Oberfläche etwa für das JDK-Tool jstack. VisualVM ist Teil ab dem JDK 6 (dort heißt es Java VisualVM), aber eine aktuelle Version findet sich immer unter https://visualvm.dev.java.net/; diese Version heißt dann einfach VisualVM. Nutzen wir die Version von der Webseite im Folgenden, da sie etwas aktueller ist.

VisualVM wird als Zip-Archiv (etwa visualvm_13.zip) angeboten. Nach dem Auspacken befindet sich unter dem bin-Ordner das ausführbare Programm visualvm.exe, das wir starten können (VisualVM lässt sich über ein Plugin auch über Eclipse, NetBeans oder IntelliJ einbinden). Beim ersten Mal müssen wir noch die Lizenzen abnicken und eine Kalibrierung starten, doch dann öffnet sich schon die grafische Oberfläche. Wählen wir links im Baum LocalVisualVM aus, so schauen wir uns die Zustände, etwa den Speicherbedarf und die Thread-Auslastung des Programms VisualVM selbst an.

Durch den Speicher wühlen: Heap Dump

Eine großartige Möglichkeit von VisualVM ist, sich während der Laufzeit zu einem Programm zu verbinden, und über die Objektverweise zu navigieren. Beispiel soll ein kleines Programm HeapUser sein, von dem wir später die vier Objektvariablen untersuchen wollen:

Listing 26.2  HeapUser.java

import java.util.*;

public class HeapUser
{
  String string = "Hallo Welt";
  Date   date   = new Date();
  ArrayList<String> list = new ArrayList<String>( Umbruch
                             Arrays.asList( string, date.toString() ) );
  HeapUser heapUser;

  public static void main( String[] args )
  {
    HeapUser h = new HeapUser();
    h.heapUser = h;
    new Scanner( System.in ).next();
    System.out.println( h.string );
  }
}

Starten wir das Programm und VisualVM läuft noch im Hintergrund, so erkennt VisualVM automatisch das gestartete Program und aktualisiert die Baumansicht unter local.

Im Kontextmenü auf HeapUser lässt sich der HeapDump erfragen.

Nach dem Aktivieren des Schalters Classes sind alle geladenen Klassen aufgeführt und wie viele Exemplare es von den Klassen gibt.

Unten gibt es ein Suchfeld, in dem wir »HeapUser« eintragen. Es bleibt eine Klasse in der Liste.

Im Kontextmenü lässt sich nun Show in Instances View aufrufen.

Die folgende Ansicht bildet den Ausgangspunkt für exploratives Arbeiten.

Links ist die Instanz abgebildet, die wir untersuchen. Das ist HeapUser, von dem es genau ein Exemplar gibt (#1). Rechts gibt es zwei Einteilungen. In der oberen Einteilung können wir die Objekteigenschaften vom links ausgewählten Objekt sehen und durch die Baumansicht tiefer reinzoomen. So enthält this, also das ausgewählte Objekt, die Variablen heapUser, list, date und string. An den auf sich selbst verweisenden Pfeilen an heapUser lässt sich – die Symbole werden in einer Art Statusleiste kurz erklärt – erkennen, dass die Variable heapUser das eigene Objekt referenziert. Falten wir list auf, so sehen wir die Objektvariablen der ArrayList-Instanz im Baum, und unter anderem lässt sich die size ablesen, also die Anzahl Elemente in der Liste. elementData wiederum ist ein Knoten, der sich auffalten lässt, er repräsentiert das interne Feld – die eckigen Klammern deuten den Typ »Feld« an – der ArrayList. Wird er ausgefaltet, gelangen wir zu den beiden Strings. Im unteren Bereich der Einteilung, bei References, ist abzulesen, wer das selektierte Objekt referenziert. Es gibt zwei Stellen, an denen das untersuchte Objekt HeapUser referenziert wird: Einmal über die lokale Variable in der main-Methode, und einmal über die Objektvariable.

Profiling von Java-Applikationen

Ein Profiler zeigt an, an welchen Stellen ein Programm Prozessorzeit verbraucht. Auf der Webseite https://visualvm.dev.java.net/profiler.html stellt Oracle eine Dokumentation bereit, wie VisualVM als Profiler genutzt wird.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de