Running jmap bekommen kann Socket-Datei nicht öffnen
Musste ich jmap
um heap-dump von meinem Prozess. aber jvm
zurückgegeben:
Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
Also habe ich die -F
:
./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
- Mit
-F
ist in Ordnung für die Aufnahme heap dump? - Ich warte 20 Minuten und noch nicht fertig. Irgendwelche Ideen, warum?
InformationsquelleAutor der Frage rayman | 2014-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
jmap
vs.jmap -F
sowiejstack
vs.jstack -F
verwenden völlig unterschiedliche Mechanismen zu communcate mit der Ziel-JVM.jmap /jstack
Beim laufen ohne
-F
diese tools verwenden Dynamische Mechanismus Befestigen. Dies funktioniert wie folgt.Bevor Sie die Verbindung zu Java-Prozess 1234,
jmap
erstellt eine Datei.attach_pid1234
auf das Arbeitsverzeichnis des zielprozesses oder bei/tmp
.Dann
jmap
sendetSIGQUIT
zu den Ziel-Prozess. Wenn JVM fängt das signal und findet.attach_pid1234
es beginntAttachListener
thread.AttachListener
thread erstellt UNIX-domain-socket/tmp/.java_pid1234
zu hören auf Befehle von externen tools.Aus Gründen der Sicherheit, wenn eine Verbindung (von
jmap
) akzeptiert wird, die JVM überprüft, ob die Anmeldeinformationen der peer-Buchse sind gleicheuid
undegid
des JVM-Prozesses. Das ist, warumjmap
wird nicht funktionieren, wenn es unter einem anderen Benutzer (auch root).jmap
verbindet den socket und sendetdumpheap
Befehl.Dieser Befehl wird gelesen und ausgeführt von
AttachListener
thread der JVM. Alle Ausgaben gesendet werden zurück an die Steckdose. Da die heap-dump-in-Prozess direkt von der JVM, die Bedienung ist wirklich schnell. Allerdings JVM können dies tun, nur bei Sicherungspunkte. Wenn Sie einen Sicherungspunkt erreicht werden kann (z.B. der Prozess aufgehängt wird, nicht reagiert, oder lange GC ist in Bearbeitung)jmap
unterbrochen und scheitern.Let ' s fassen die Vorteile und die Nachteile von Dynamischen Anfügen.
Profis.
jmap
oderjstack
Verbindung zu einer anderen version der JVM.Nachteile.
euid
/egid
) als der Ziel-JVM.-XX:+DisableAttachMechanism
.jmap -F /jstack -F
Beim ausführen mit
-F
die Werkzeuge wechseln zu speziellen Modus, die Funktionen HotSpot-Tauglichkeits-Agent. In diesem Modus wird die soll-Prozess eingefroren ist; die tools Lesen, den Speicher über den OS-debugging-Einrichtungen, nämlichptrace
auf Linux.jmap -F
ruftPTRACE_ATTACH
auf der Ziel-JVM. Die Ziel-Prozess ist bedingungslos ausgesetzt, in Reaktion aufSIGSTOP
signal.Liest das tool JVM-Speicher mit
PTRACE_PEEKDATA
.ptrace
Lesen kann nur ein Wort in einer Zeit, so dass zu viele Anrufe erforderlich, um Lesen Sie den großen Haufen der Ziel-Prozess. Das ist sehr, sehr langsam.Das tool rekonstruiert JVM-internen Strukturen auf der Grundlage der Kenntnisse der einzelnen JVM-version. Da verschiedene Versionen von JVM haben unterschiedliche Speicher-layout
-F
- Modus funktioniert nur, wennjmap
kommt aus der gleichen JDK als Ziel-Java-Prozess.Erstellt das tool heap-dump selbst und dann wieder den soll-Prozess.
Profis.
ptrace
funktioniert, wenn OS-level-Privilegien sind genug. E. g.root
- dump-Prozesse aller Benutzer.Nachteile.
jmap
versucht, behandeln Sie alle besonderen Fällen kann es manchmal vorkommen, dass die Ziel-JVM nicht in einem konsistenten Zustand.Hinweis
Es ist ein schneller Weg, um heap-dumps in den Modus "erzwungen". Erstellen Sie als erstes wurde ein Speicherabbild mit
gcore
dann laufenjmap
über den generierten core-Datei. Sehen die damit verbundene Frage.InformationsquelleAutor der Antwort apangin
Ich gerade festgestellt, dass die jmap (und vermutlich jvisualvm, wenn Sie es zu erzeugen, einen heap-dump) erzwingt, dass der Benutzer mit jmap muss der gleiche Benutzer, der den Prozess ausführt, die versuchen, zu Dumpingpreisen.
in meinem Fall die jvm-ich will ein heap-dump ausgeführt wird, die durch linux-Benutzer "jboss". also, wo
sudo jmap -dump:file.bin <pid>
war reporting "Unable to open socket:" ich war in der Lage, schnappen Sie sich meine heap-dump mit:InformationsquelleAutor der Antwort ben_wing
Genau wie ben_wing sagte, Sie können ausführen mit:
(in meinem Fall der user ist
jboss-as
aber verkaufen könntejboss
oder einige andere.)Aber es war nicht genug, denn fragte er mich nach einem Passwort (
[sudo] password for ec2-user:
), obwohl ich laufen konntesudo
ohne Aufforderung an mich für ein Kennwort mit anderen Befehlen.Fand ich die Lösung hierund ich brauchte nur einen weiteren hinzufügen
sudo
erste:Funktioniert es mit anderen Befehlen wie
jcmd
undjinfo
zu.InformationsquelleAutor der Antwort Lucas Basquerotto