L'exécution de jmap ne permet pas d'ouvrir le fichier socket
j'ai dû lancer jmap
afin de prendre en tas mon processus. mais jvm
retourné:
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
donc j'ai utilisé le -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 ...
- en utilisant
-F
est-ce que tout va bien pour une décharge? - j'attends 20 minutes et je n'ai pas encore fini. Des idées pourquoi?
3 réponses
jmap
vs. jmap -F
, ainsi que jstack
vs. jstack -F
utilisent des mécanismes complètement différents pour communiquer avec le JVM cible.
jmap / jstack
sans -F
ces outils utilisent mécanisme D'attache dynamique . Cela fonctionne comme suit.
-
avant de se connecter au processus Java 1234,
jmap
crée un fichier.attach_pid1234
dans le répertoire de travail du processus cible ou à/tmp
. -
puis
jmap
envoieSIGQUIT
au processus cible. Lorsque JVM capte le signal et trouve.attach_pid1234
, il démarre le filAttachListener
. -
AttachListener
thread crée de socket de domaine UNIX/tmp/.java_pid1234
à l'écoute de commandes à partir d'outils externes. -
pour pour des raisons de sécurité lorsqu'une connexion (de
jmap
) est acceptée, JVM vérifie que les justificatifs d'identité de la socket peer sont égaux àeuid
etegid
du processus JVM. C'est pourquoijmap
ne fonctionnera pas s'il est exécuté par un utilisateur différent (même racine). -
jmap
se connecte à la socket, et envoie la commandedumpheap
. -
cette commande est lue et exécutée par
AttachListener
fil de la JVM. La sortie est renvoyé à la prise. Étant donné que la décharge de tas est faite en cours de fabrication directement par JVM, l'opération est vraiment rapide. Cependant, JVM ne peut le faire qu'aux safepoints . Si un point de sécurité ne peut pas être atteint (par exemple, le processus est suspendu, ne répond pas, ou un long GC est en cours),jmap
va temporiser et échouer.
résumons les avantages et les inconvénients de L'attache dynamique.
Pros.
- les opérations de déchargement en tas et autres sont effectuées en collaboration par JVM à la vitesse maximale.
- vous pouvez utiliser n'importe quelle version de
jmap
oujstack
pour vous connecter à n'importe quelle autre version de JVM.
Cons.
- L'outil doit être exécuté par le même utilisateur (
euid
/egid
) comme le cible de la JVM. - ne peut être utilisé que sur des JVM vivantes et saines.
- ne fonctionnera pas si la JVM cible est commencée par
-XX:+DisableAttachMechanism
.
jmap-F / jstack-f
avec -F
les outils passent en mode spécial qui dispose de HotSpot Serviceability Agent . Dans ce mode, le processus cible est gelé; les outils lisent sa mémoire par l'intermédiaire des installations de débogage OS, à savoir, ptrace
sur Linux.
-
jmap -F
invoquePTRACE_ATTACH
sur la cible JVM. Le processus cible est suspendu sans condition en réponse au signalSIGSTOP
. -
l'outil lit la mémoire JVM en utilisant
PTRACE_PEEKDATA
.ptrace
peut lire un seul mot à la fois, trop d'appels nécessaires pour lire les gros tas de le processus cible. C'est très très lent. -
l'outil reconstruit les structures internes de JVM sur la base de la connaissance de la version particulière de JVM. Étant donné que les différentes versions de JVM ont des configurations de mémoire différentes, le mode
-F
ne fonctionne que sijmap
provient du même JDK que le processus Java cible. -
l'outil crée un tas de dump lui-même et reprend ensuite le processus cible.
Pros.
- aucune coopération de l'entreprise commune cible n'est requise. Peut être utilisé même sur un procédé suspendu.
-
ptrace
fonctionne lorsque les privilèges au niveau OS sont suffisants. Par exemple:root
peut vider les processus de tous les autres utilisateurs.
Cons.
- très lent pour de grands tas.
- l'outil et le processus cible doivent provenir de la même version de JDK.
- le point de sécurité n'est pas garanti lorsque l'outil se fixe en mode forcé. Bien que
jmap
essaie de gérer tous les cas spéciaux, il peut arriver que la JVM cible ne soit pas dans un état cohérent.
Note
il y a un moyen plus rapide de faire des dumps en mode forcé. Tout d'abord, créer un coredump avec gcore
, puis lancez jmap
sur le fichier core généré. Voir la question connexe .
je viens de découvrir que jmap (et probablement jvisualvm lorsqu'il l'utilise pour générer un dump tas) impose que l'utilisateur qui exécute jmap doit être le même utilisateur qui exécute le processus en essayant d'être largué.
dans mon cas, le JVM je veux un tas de dump pour est exécuté par l'utilisateur linux"jboss". donc, où sudo jmap -dump:file.bin <pid>
signalait " impossible d'ouvrir la socket:", j'ai pu saisir mon tas de déblais en utilisant:
sudo -u jboss jmap -dump:file.bin <pid>
comme ben_wing said, vous pouvez exécuter avec:
sudo -u jboss-as jmap -dump:file.bin <pid>
(dans mon cas, l'utilisateur est jboss-as
, mais le vôtre pourrait être jboss
ou autres.)
mais ce n'était pas suffisant, parce que il m'a demandé un mot de passe ( [sudo] password for ec2-user:
), bien que je puisse exécuter sudo
sans me demander un mot de passe avec d'autres commandes.
j'ai trouvé la solution ici , et j'ai juste besoin d'ajouter un autre sudo
d'abord:
sudo sudo -u jboss-as jmap -dump:file.bin <pid>
il fonctionne avec d'autres commandes comme jcmd
et jinfo
aussi.