Thomas Darimont
Erfahrenes Mitglied
Interner HotSpot Debugger in Java 7
Hallo,
wer schon immer mal in die HotSpot-Innerein der JVM abtauchen wollte hat mit dem Tool HSDB
die Möglichkeit dazu.
Seit Java 7 jdk1.7.0_01 gibt es im Verzeichnis %JAVA7_HOME%\lib\ das Jar: sa-jdi.jar
In diesem Jar befindet sich eine interessante Java Anwendung (HSDB) welche man über folgenden Aufruf starten kann:
Hat man die Anwendung gestartet kann man sich mit einem HotSpot JVM Java Prozess darauf verbinden, einen
HotSpot Core Dump laden oder sich mit einem DebugServer verbinden.
Für's erste berbinden wir uns mal mit einem HotSpot JVM Prozess - Dies geht beispielsweise über:
File -> Attach to HotSpot Process im Eingabefeld gibt man nun die PID (Process ID) eines
entsprechenden Java Prozesses ein. Die PID kann man unter Windows beispielsweise über den Taskmanager herausfinden oder das Java Tool: JPS vewenden.
Der Java Prozess 1180 ohne Namen ist meine aktuell Laufende Eclipse Instanz. Ich vermute mal, dass bei der JVM hier kein Name angezeigt wird, da die JVM hier intern vom eclipse launcher (eclipse.exe) erzeugt wurde.
Nichtsdestotrotz können wir uns mit dieser PID verbinden.
Wir sehen eine Auflistung der aktuellen Java Threads mit Ihren OS Thread-Ids und Java Thread Names.
Klicken wir auf einen Thread in der Liste sehen wir die interne Struktur des Threads. Insbesondere die
echten Speicheradressen der hinter den Java Objekten liegenden HotSpot Strukturen.
Darüber hinaus kann man über das menü Tools noch zahlreiche weitere Ansichten erreichen...
Siehe Screenshots
Btw. sollte jemand die folgende Fehlermeldung erhalten, dann sucht Java die sawindbg.dll an der falschen Stelle. Diese dll findet man beispielsweise in folgendem Verzeichnis:
C:\Program Files\Java\jdk1.7.0_03\jre\bin hier muss man also gegebenenfalls die DLL kopieren, oder die Umgebungsvariablen entsprechend anpassen.
Viel Spaß damit!
Gruß Tom
Hallo,
wer schon immer mal in die HotSpot-Innerein der JVM abtauchen wollte hat mit dem Tool HSDB
die Möglichkeit dazu.
Seit Java 7 jdk1.7.0_01 gibt es im Verzeichnis %JAVA7_HOME%\lib\ das Jar: sa-jdi.jar
In diesem Jar befindet sich eine interessante Java Anwendung (HSDB) welche man über folgenden Aufruf starten kann:
Code:
java -cp "C:\Program Files\Java\jdk1.7.0_03\lib\sa-jdi.jar" sun.jvm.hotspot.HSDB
Hat man die Anwendung gestartet kann man sich mit einem HotSpot JVM Java Prozess darauf verbinden, einen
HotSpot Core Dump laden oder sich mit einem DebugServer verbinden.
Für's erste berbinden wir uns mal mit einem HotSpot JVM Prozess - Dies geht beispielsweise über:
File -> Attach to HotSpot Process im Eingabefeld gibt man nun die PID (Process ID) eines
entsprechenden Java Prozesses ein. Die PID kann man unter Windows beispielsweise über den Taskmanager herausfinden oder das Java Tool: JPS vewenden.
Code:
C:\Users\Tom>jps
6896 HSDB
1180
7088 Jps
Nichtsdestotrotz können wir uns mit dieser PID verbinden.
Wir sehen eine Auflistung der aktuellen Java Threads mit Ihren OS Thread-Ids und Java Thread Names.
Klicken wir auf einen Thread in der Liste sehen wir die interne Struktur des Threads. Insbesondere die
echten Speicheradressen der hinter den Java Objekten liegenden HotSpot Strukturen.
Darüber hinaus kann man über das menü Tools noch zahlreiche weitere Ansichten erreichen...
Siehe Screenshots

Btw. sollte jemand die folgende Fehlermeldung erhalten, dann sucht Java die sawindbg.dll an der falschen Stelle. Diese dll findet man beispielsweise in folgendem Verzeichnis:
C:\Program Files\Java\jdk1.7.0_03\jre\bin hier muss man also gegebenenfalls die DLL kopieren, oder die Umgebungsvariablen entsprechend anpassen.
Code:
C:\Windows\system32>java -cp "C:\Program Files\Java\jdk1.7.0_03\lib\tools.jar;C:\Program Files\Java\jdk1.7.0_03\lib\sa-jdi.jar" sun.jvm.hotspot.HSDB
Exception in thread "Thread-1" java.lang.UnsatisfiedLinkError: Can't load library: C:\Program Files\Java\jre7\bin\sawindbg.dll
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.<clinit>(WindbgDebuggerLocal.java:651)
at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:512)
at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:312)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
at sun.jvm.hotspot.HSDB.attach(HSDB.java:1168)
at sun.jvm.hotspot.HSDB.access$1700(HSDB.java:53)
at sun.jvm.hotspot.HSDB$25$1.run(HSDB.java:436)
at sun.jvm.hotspot.utilities.WorkerThread$MainLoop.run(WorkerThread.java:66)
at java.lang.Thread.run(Unknown Source)
Viel Spaß damit!
Gruß Tom