2009-04-07 8 views
10

Ich laufen JVisualVM (Windows XP, Sun Java 1.6.0.13, 32-Bit-Client-VM), um eine entfernte Anwendung (Linux, Sun Java 1.6.0.07, 64-Bit-Server-VM). Vor der eigentlichen Remote-Anwendung starten, starte ich auf der entfernten Maschine jstatd eine alle Zugriffsrichtlinie mit:Get Heap Dump von einer Remote-Anwendung in Java mit JVisualVM

grant codebase "file:${java.home}/../lib/tools.jar" { 
    permission java.security.AllPermission; 
}; 

Dann beginne ich die eigentliche App über die Befehlszeile

java -Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=3333 
compileTest.Main 

der Client-Maschine, ich kann die entfernte App sehen und überwachen. Ich kann auch einen Thread-Dump usw. machen. Leider ist der Heap-Dump-Button ausgegraut.

Wie kann ich mit JVisualVM einen Heap-Dump von einer fernüberwachten Anwendung erhalten?

Ich habe versucht mit jConsole. Mit jConsole ist es möglich, einen entfernten Heap-Dump mit der Operation com.sun.management.HotSpotDiagnostic dumpHeap zu erstellen. Ich möchte, dass der Dump auf die Clientseite übertragen und mit den von JVisualVM bereitgestellten Tools analysiert wird. Wie kann ich das machen?

+0

jvisualvm als der Benutzer ausgeführt wird, der den Java-Prozess ausgeführt wird, kann – rogerdpack

+0

@rogerdpack guten Punkt helfen! Ich navigierte zu dieser Frage/Thema, da ich die gleiche Frage wie http://stackoverflow.com/questions/8799929/visualvm-unable-to-sampler-memory habe, und ich denke, Ihre Aussage/Annahme ist richtig. Wenn ich tomcat/tomee über meine NetBeans-IDE auf meinem Entwickler-PC/-Server starte, ist die Schaltfläche Sampler> Memory aktiviert, aber die Schaltfläche Sampler> Memory ist auf dem Produktionsserver deaktiviert, da tomcat/tomee als Windows-Dienst ausgeführt wird Ich bin nicht als System- oder lokaler Dienst in den Produktionsdienst eingeloggt. :( – Howard

Antwort

0

Sie können den Heap nicht remote analysieren. Sie könnten Visualvm auf Ihrem Server ausführen und die x-Sitzung auf Ihren lokalen Rechner exportieren. Sie müssten x11 auf Ihrem Server installiert haben, was viele Server nicht tun.

3

Leider gibt es keinen automatisierten Weg, dies zu tun. Sie müssen jmap manuell auf dem Linux-Server ausführen, um den Heap Ihrer JVM zu sichern und dann den resultierenden Heap-Dump auf Ihren lokalen Rechner mit JVisualVM zu kopieren und den Heap-Dump mit File | Load ... in JVisualVM zur Analyse zu laden.

6

Es gibt einen Weg, es zu tun!

  1. rmiregistry -J-Xbootclasspath/p: $ JAVA_HOME/lib/sa-jdi.jar (diese verwendet Port 1099)
  2. start 'jsadebugd' auf der Maschine, in der Anwendung ausgeführt wird: jsadebugd & (pid von JVM)
  3. Auf Remote-Maschine Gebrauch folgende jmap -dump: file =: 1099

  4. jhat

Die oben wird eine Web-Anwendung auf Port starten 7000

Alle oben genannten Tools sind Teil von JDK 1.6

Alles Gute!

+0

würde dies zu einer Leistungseinbuße für die laufende App führen? Vielleicht ist das egal. –

2

Seit 1.3, VisualVM Unterstützung Remote-Heap-Dumps:

mit VisualVM Ab 1.3 können Sie jetzt das Heap in dem Werkzeug Dump Aktionen und Schaltflächen verwenden, um einen Heap Dump von Anwendungen zu übernehmen, die remote ausgeführt werden. Nach dem Aufruf wird ein Dialogfeld angezeigt, in dem Sie den vollständigen Pfad auf dem fernen System angeben können, auf dem der Heapspeicher abgelegt werden soll. Nachdem der Heapspeicherauszug erstellt wurde, müssen Sie die Datei manuell auf Ihren lokalen Computer kopieren und die Aktion Laden zum Öffnen und Analysieren der Datei mit VisualVM verwenden.

See: VisualVM 1.3 Released