Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort
Download: - openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Java 7 - Mehr als eine Insel | vor >>
Java 7 - Mehr als eine Insel von Christian Ullenboom Das Handbuch zu den Java SE-Bibliotheken
Java 7 - Mehr als eine Insel Galileo Computing 1433 S., 2012, geb. 49,90 Euro, ISBN 978-3-8362-1507-7 |
| 23 Dienstprogramme für die Java-Umgebung
|  | 23.1 Programme des JDK
|  | 23.2 Monitoringprogramme vom JDK
|  |  | 23.2.1 jps
|  |  | 23.2.2 jstat
|  |  | 23.2.3 jmap
|  |  | 23.2.4 jstack
|  |  | 23.2.5 VisualVM
|  | 23.3 Programmieren mit der Tools-API
|  |  | 23.3.1 Eigene Doclets
|  | 23.4 Ant
|  |  | 23.4.1 Bezug und Installation von Ant
|  |  | 23.4.2 Das Build-Skript build.xml
|  |  | 23.4.3 Build den Build
|  |  | 23.4.4 Properties
|  |  | 23.4.5 Externe und vordefinierte Properties
|  |  | 23.4.6 Weitere Ant-Tasks
|  | 23.5 Disassembler, Decompiler und Obfuscator
|  |  | 23.5.1 Der Diassembler javap
|  |  | 23.5.2 Decompiler
|  |  | 23.5.3 Obfuscatoren
|  | 23.6 Weitere Dienstprogramme
|  |  | 23.6.1 Sourcecode Beautifier
|  |  | 23.6.2 Java-Programme als Systemdienst ausführen
|  | 23.7 Zum Weiterlesen
## 23.2 Monitoringprogramme vom JDK Java ist eine beliebte Technologie auf der Serverseite, und da ist das Überwachen einer JVM sehr wichtig. ### 23.2.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:\Program Files\Java\jdk1.7.0\bin>jps -mlvV
    11372  -Xms40m -Xmx384m -XX:MaxPermSize=256m
    12876 sun.tools.jps.Jps -mlvV -Dapplication.home=c:\Program Files\Java\jdk1.7.0 -Xms8m
Die Optionen sind: -l listet den Paketnamen der Klasse mit dem main() auf. -m zeigt die an die main()-Methode übergebenen Argumente an. –v und –V zeigen die an die JVM übergebenen Parameter an. Mehr Details gibt es unter http://download.oracle.com/javase/7/docs/technotes/tools/share/jps.html. Unter Java 6 zeigt jps bei Eclipse noch »org.eclipse.equinox.launcher_....jar« an, bei Java 7 ist die Ausgabe leider leer. jps selbst ist auch in der Liste. In dieser Sitzung ist die ID von Eclipse 11372. Die folgenden Beispiele nutzen die Eclipse-ID für zusätzliche Anfragen. ### 23.2.2 jstat Mit jstat, dem Java Virtual Machine Statistics Monitoring Tool, ist es möglich, Performance-Statistiken zu erfragen:
    c:\Program Files\Java\jdk1.7.0\bin>jstat -gcutil 11372
      S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
      0,00   0,00   0,41  46,19  99,43     42    0,575   278   56,867   57,442
Die Ausgaben zeigen zum Beispiel mit FGC die Anzahl der GC-Ereignisse an. Die ID 11372 erfahren wir vom Tool jps. Die Seite http://download.oracle.com/javase/7/docs/technotes/tools/share/jstat.html schlüsselt die Abkürzungen auf. ### 23.2.3 jmap Das Memory-Map-Tool namens jmap zeigt eine Liste mit der Anzahl der Exemplare von Java-Objekten und zeigt auch, wie viel Hauptspeicher sie verbrauchen. Für Eclipse ist die Anzahl der Objekte sehr groß, sodass die Ausgabe hier gekürzt ist:
    c:\Program Files\Java\jdk1.7.0\bin>jmap -histo 11372

     num     #instances         #bytes  class name
    ----------------------------------------------
       1:        103936       16083192  <constMethodKlass>
       2:         98630        9517600  [C
       3:        103936        8327696  <methodKlass>
       4:         10042        6929984  <constantPoolKlass>
       5:         10042        4533928  <instanceKlassKlass>
       6:          8560        4067552  <constantPoolCacheKlass>
       7:         85434        3901168  [B
       8:         76434        1834416  java.lang.String
       9:         64731        1553544  java.util.HashMap$Entry
      10:         32035        1416784  [I
      11:         10953        1292104  java.lang.Class
    ...
    4409:             1              8  org.eclipse.jdt.internal.debug.ui....
    4410:             1              8  org.eclipse.jdt.ui.actions.Organize...
    4411:             1              8  org.eclipse.jdt.internal.corext.refactoring....
    Total        818672       68628952
Ein paar Details mehr sind unter http://download.oracle.com/javase/7/docs/technotes/tools/share/jmap.html zu finden. ### 23.2.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:\Program Files\Java\jdk1.7.0\bin>jstack  11372
    2011-08-12 15:51:37
    Full thread dump Java HotSpot(TM) Client VM (21.0-b17 mixed mode, sharing):

    "org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x06214000 nid=0x30c4 in Object.wait() [0x069df000]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            – waiting on <0x19ff2978> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue)
            at ...

    "Worker-28" prio=6 tid=0x06211400 nid=0xad0 in Object.wait() [0x0711f000]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            – waiting on <0x18b981c0> (a org.eclipse.core.internal.jobs.WorkerPool)
            ...
            at org.eclipse.core.internal.jobs.Worker.run(Worker.java:50)

    ...

    "[ThreadPool Manager] – Idle Thread" daemon prio=6 tid=0x06211c00 nid=0x295c in
    Object.wait() [0x08d7f000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            ...
    ...

    "Service Thread" daemon prio=6 tid=0x01f52000 nid=0x2d78 runnable [0x00000000]
       java.lang.Thread.State: RUNNABLE

    "C1 CompilerThread0" daemon prio=10 tid=0x01f36c00 nid=0x2b38 waiting on condition
    [0x00000000]
       java.lang.Thread.State: RUNNABLE

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

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

    "Finalizer" daemon prio=8 tid=0x01f2a400 nid=0x2004 in Object.wait() [0x044df000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            – waiting on <0x18997800> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(Unknown Source)
            – locked <0x18997800> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(Unknown Source)
            at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

    "Reference Handler" daemon prio=10 tid=0x01f25000 nid=0x2ca8 in Object.wait() [0x043df000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            – waiting on <0x189974a0> (a java.lang.ref.Reference$Lock)
            at java.lang.Object.wait(Object.java:503)
            at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
            – locked <0x189974a0> (a java.lang.ref.Reference$Lock)

    "main" prio=6 tid=0x01e19c00 nid=0x2b34 runnable [0x0012f000]
       java.lang.Thread.State: RUNNABLE
            at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
            at org.eclipse.swt.widgets.Display.sleep(Display.java:4652)
            ...
            at org.eclipse.equinox.launcher.Main.run(Main.java:1410)

    "VM Thread" prio=10 tid=0x01f23c00 nid=0x28ec runnable

    "VM Periodic Task Thread" prio=10 tid=0x01f5c000 nid=0x2898 waiting on condition

    JNI global references: 373
Zum Stack-Strace der Threads gibt es weitere Informationen unter http://download.oracle.com/javase/7/docs/technotes/tools/share/jstack.html. ### 23.2.5 VisualVM VisualVM ist eine grafische Oberfläche mit einfachen Profiling-Möglichkeiten und bettet Kommandozeilenwerkzeuge wie jstack ein. VisualVM ist Teil von Java ab dem JDK 6, aber eine aktuelle Version findet sich immer unter https://visualvm.dev.java.net/. Im JDK befindet es sich wie die anderen Tools im bin-Verzeichnis und hört auf den Namen jvisualvm. Wir wollen die mitgelieferte Version nutzen. Beim ersten Mal müssen wir eine Kalibrierung starten, doch dann öffnet sich schon die grafische Oberfläche. Wählen wir links im Baum Local • VisualVM aus, so schauen wir uns die Zustände, etwa den Speicherbedarf und die Thread-Auslastung des Programms VisualVM selbst an (siehe Abbildung 23.1). #### Durch den Speicher wühlen: Heap-Dump Visual VM bietet die großartige Möglichkeit, sich während der Laufzeit zu einem Programm zu verbinden und über die Objektverweise zu navigieren. Unser Beispiel soll ein kleines Programm HeapUser sein, von dem wir später die vier Objektvariablen untersuchen wollen: Abbildung 23.1: Screenshot der VisualVM Listing 23.1: HeapUser.java
    import java.util.*;

    public class HeapUser
    {
      String string = "Hallo Welt";
      Date   date   = new Date();
      ArrayList<String> list = new ArrayList<String>(
                                 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ü lässt sich über HeapUser der Heap-Dump erfragen. Abbildung 23.2: Heap-Dump anzeigen Nach dem Aktivieren des Schalters Classes sind alle geladenen Klassen aufgeführt und es ist zu sehen, wie viele Exemplare es von den Klassen gibt. Abbildung 23.3: Anzeige der geladenen Klassen mit Statistik Unten gibt es ein Suchfeld, in dem wir »HeapUser« eintragen. Es bleibt eine Klasse in der Liste. Abbildung 23.4: Suchen nach »HeapUser« Im Kontextmenü lässt sich nun Show in Instances View aufrufen. Abbildung 23.5: Exemplare vom Typ »HeapUser« anfordern Die folgende Ansicht bildet den Ausgangspunkt für exploratives Arbeiten. Abbildung 23.6: Attribute und Belegungen einsehen 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 der 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 | <top> | vor >>
Zum Katalog
Java 7 – Mehr als eine Insel Jetzt bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchempfehlungen
| Java und XML
| Einstieg in Eclipse 3.7
| Android 3
| NetBeans Platform 7
| Java ist auch eine Insel
| Apps entwickeln für Android 4
| Java 7
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das 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.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de