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 ...
  1. en utilisant -F est-ce que tout va bien pour une décharge?
  2. j'attends 20 minutes et je n'ai pas encore fini. Des idées pourquoi?
55
demandé sur jezrael 2014-10-01 15:20:52

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.

  1. 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 .

  2. puis jmap envoie SIGQUIT au processus cible. Lorsque JVM capte le signal et trouve .attach_pid1234 , il démarre le fil AttachListener .

  3. AttachListener thread crée de socket de domaine UNIX /tmp/.java_pid1234 à l'écoute de commandes à partir d'outils externes.

  4. 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 et egid du processus JVM. C'est pourquoi jmap ne fonctionnera pas s'il est exécuté par un utilisateur différent (même racine).

  5. jmap se connecte à la socket, et envoie la commande dumpheap .

  6. 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 ou jstack 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.

  1. jmap -F invoque PTRACE_ATTACH sur la cible JVM. Le processus cible est suspendu sans condition en réponse au signal SIGSTOP .

  2. 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.

  3. 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 si jmap provient du même JDK que le processus Java cible.

  4. 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 .

110
répondu apangin 2017-05-23 12:18:27

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>
65
répondu ben_wing 2014-12-11 03:39:29

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.

0
répondu Lucas Basquerotto 2017-05-31 20:40:37