Nicht verwenden JVisualVM profiling für Tomcat7 läuft als Dienst auf Windows7
Ich versuche zu Profil, ein Servlet läuft in Apache Tomcat (7.0.34) als Dienst auf Windows 7 (64 bit) mit JVisualVM (JDK-1.7.0 - 06, 64-bit) lokal ausgeführt.
Zunächst hatte ich das problem das der Tomcat nicht angezeigt in der Liste der lokalen Anwendungen, die aufgrund der unterschiedlichen "java.io.tmp" - Eigenschaft bug/feature, aber um ihn herum gearbeitet, wie angeraten in mehreren posts in diesem forum.
Aber obwohl der Tomcat-Prozess zeigt nun in der Liste der lokalen Anwendungen, die als "Lokale Anwendung", wenn ich öffnen Sie den Prozess gibt es keine tabs für Monitor, Threads, Sampler oder Profil - nur die Registerkarte Übersicht für die JVM-Argumente und-Sytem Eigenschaften sub-Registerkarten zeigen die gefürchtete "nicht unterstützt für diese jvm" - Meldung.
Habe ich doppelt überprüft die folgenden Elemente:
- dass sowohl Tomcat als auch JVisualVM laufen die gleiche version von Java, indem man die JVM-Eigenschaften in JVisualVM (unter Verwendung einer JMX-Verbindung zum Tomcat)
- dass sowohl Tomcat als auch JVisualVM habe das gleiche "java.io.tmp" - Pfad, indem man die System-Eigenschaften in der JVisualVM (wieder mithilfe einer JMX-Verbindung zum Tomcat) UND im Blick auf die tatsächlichen TMP/TEMP-Verzeichnis und bestätigen, dass die PID-Dateien existieren beide
- dass das Dateisystem NTFS ist
- dass der Windows-Benutzer nicht mit einem Unterstrich im Namen haben (Hinweis: der Benutzer hat eine Periode, in der name, wie wir mit Netzwerk-Benutzernamen in der form "Vorname.lastname", aber ich habe keine Probleme mit der Anzeige andere Java-Anwendungen in JVisualVM, so glaube nicht, dass dies ein Problem ist)
- dass sowohl Tomcat als auch JVisualVM ausgeführt werden, als die gleichen Windows-Benutzer, indem man die Prozesse im Task-Manager
Ein paar Letzte Punkte:
- Ich muss Profil das Servlet, so dass die Verwendung von JMX ist nicht ausreichend
- Ich war in der Lage, um ein Profil auf einem Windows XP-Rechner (Java 7, Tomcat 7 als service), so würde sich ein Windows 7 /64 bit was?
Wenn jemand hatte und gelöst wird dieses Problem offensichtlich die Lösung wäre sehr geschätzt werden. Wäre aber sinnvoll sein, nur wissen, ob andere Menschen sind, läuft die gleiche Konfiguration - Windows 7 64 bit, Java 7 64 bit, Tomcat 7 läuft als Dienst - erfolgreich.
Update: Statt als Dienst ausgeführt wird, lief ich den Tomcat mit der batch-Datei und alle funktionierte perfekt: was gibt es als Dienst ausführen?
- Nur damit Sie wissen, du bist nicht verrückt, ich habe das gleiche Problem mit anderen servlet-Containern. Ich in der Regel Feuer bis Sysinternals Process Explorer, schauen Sie in die "command line" - Spalte (die default-Win process explorer ist begrenzt auf 255 Zeichen), führen, dass Sie von einer Eingabeaufforderung aus, und befestigen Sie VisualVM.
- Was Windows-Benutzer ist der Tomcat-Dienst läuft, wie? Das kann den Unterschied machen. Versuchen Sie es mit VisualVM als der exakt gleiche Benutzer den Tomcat-Dienst läuft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits angedeutet in meinem vorherigen Kommentar. Ich denke die einfache Antwort ist es ist nicht möglich. Um die Realisierung der Kommunikation zwischen jconsole/jvisualvm und den zu überwachenden Prozess benutzt Java-memory-mapped-Dateien. Am Ende läuft es auf eine bestimmte Windows-API-Aufruf, die nicht aufgrund der "Windows Service Hardening" [1] - Funktion in Windows Vista Hinzugefügt und die, natürlich, gibt es auch in Windows 7 und späteren Versionen.
Den Anruf fehlschlägt, wird die Funktion OpenFileMapping wie gesehen werden kann, in perfMemory_windows.cpp Zeile 1402 [2]. Während meiner Experimente die Methode aufgerufen wird, mit einem argument der form "hsperfdata_[Benutzername]_[Prozess-id]". Als weitere detaillierte in Microsofts Erklärung der Unterschiede eingeführt durch das service hardening (siehe [3]), die Kommunikation funktioniert nicht, wenn kein Präfix verwendet wird: "Wenn ein Benutzer der Anwendung [...] synchronisiert mit dem service von dem erstellen oder öffnen Sie die Objekte mit der Local\ prefix (oder kein Präfix, das standardmäßig auf Lokal), die Anwendung funktioniert nicht mehr wie erwartet."
Wenn jemand will, um einen Blick zu nehmen selbst. Sie können die Logger-tool [4] enthalten, die mit den Windows debugging tools trace-API-Aufrufe.
Auch der Sysinternals Process Explorer ist sehr praktisch, da er zeigt den kompletten Namen für die memory-mapped-Dateien, die über seine "Find Handle oder DLL..." - Funktion. Nur die Suche für die Griffe mit "hsperf".
Als kleiner Hinweis: Die Problemumgehung zu löschen oder sonst Chaos mit den temporären Ordner in dem die hsperf Daten darauf an, die Tatsache, dass der Fall von der Benutzername, den Sie durch den zu überwachenden Prozess und der monitoring-Prozess muss konsistent sein. Aber anstatt ändern Sie das temporäre Verzeichnis, Sie können auch einfach ändern Sie das USERNAME-Umgebungsvariablen verwendet, die von der monitoring-Prozess. Sie können auch sehen, wie es verwendet wird in perfMemory_windows.cpp Linie 272 [2].
[1] http://technet.microsoft.com/en-us/library/cc507844.aspx#EHF
[2] http://hg.openjdk.java.net/jdk7/hotspot-rt/hotspot/file/5dce25362b8a/src/os/windows/vm/perfMemory_windows.cpp
[3] http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx
[4] http://msdn.microsoft.com/en-us/library/windows/hardware/ff560123(v=vs. 85).aspx
Du es fast geschafft "Statt als Dienst ausgeführt wird, lief ich den Tomcat mit der batch-Datei und alle funktionierte perfekt: was gibt es als Dienst ausgeführt wird" Jetzt ist der einzige Schritt nach Links war zu laufen JVisualVM als Dienst 🙂
Finden Sie diese
https://blogs.oracle.com/nbprofiler/entry/monitoring_java_processes_running_as
Da nur Java-Prozesse laufen unter dem gleichen Benutzer wie VisualVM Profil erstellt werden kann, ist der einzige Weg, um ein Profil der Windows-Dienst ist (was standardmäßig unter dem System-Konto) ist der start der VisualVM selbst als Windows-service. Beachten Sie, dass dieser Ansatz funktioniert nicht auf Windows Vista aufgrund von Sicherheits-Beschränkungen, die standardmäßig verhindern, dass die services anzuzeigen, die UI.
Weitere option ist zu laufen, um zu Laufen CMD.EXE als "Lokales System", Siehe weiter unten.
http://vicevoice.blogspot.in/2009/09/vaas-visualvm-as-service.html
Können Sie nicht einfach über das Netz verbinden, ich.e starten Sie die JVM mit
und erstellen Sie eine Netzwerk-Verbindung über das tool " localhost:1234
Ich würde auch neugierig sein, wenn jemand eine Lösung hat, die auf Windows 7. Wie erwähnt wurde der trick ausgeführt VisualVM als Dienst funktioniert nicht auf Vista, und ich gehe davon aus, dass die gleichen Sicherheits-features verhindern, dass es funktioniert auf Win 7.
Die einzige Lösung, die ich haben ist, um Ihre app-server (Tomcat) als service, so dass, wenn der server neu gestartet wird, es wird kommen und verfügbar sein. Dann manuell den Dienst beenden und starten Sie Ihr app-server (Tomcat) in einer Befehlszeile, und eine Verbindung mit VisualVM. Dann hast du schön die überwachung, solange der server nicht neu gestartet.