Ejecutando jmap getting No se puede abrir el archivo socket

Tuve que ejecutar jmap para realizar el volcado de mi proceso. pero jvm regresó:

 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 

Entonces usé el -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. ¿Usar -F está bien para tomar el volcado de stack?
  2. Estoy esperando 20 minutos y aún no he terminado. ¿Alguna idea de por qué?

jmap vs. jmap -F , así como jstack vs. jstack -F usan mecanismos completamente diferentes para comunicarse con la JVM objective.

jmap / jstack

Cuando se ejecutan sin -F estas herramientas utilizan el mecanismo de conexión dinámica . Esto funciona de la siguiente manera.

  1. Antes de conectarse al proceso Java 1234, jmap crea un archivo .attach_pid1234 en el directorio de trabajo del proceso objective o en /tmp .

  2. Entonces jmap envía SIGQUIT al proceso objective. Cuando JVM capta la señal y encuentra .attach_pid1234 , inicia el hilo AttachListener .

  3. AttachListener subproceso AttachListener crea el socket de dominio UNIX /tmp/.java_pid1234 para escuchar los comandos de herramientas externas.

  4. Por razones de seguridad, cuando se acepta una conexión (de jmap ), JVM verifica que las credenciales del par de socket son iguales a euid y egid del proceso de JVM. Es por eso que jmap no funcionará si lo ejecuta un usuario diferente (incluso por root).

  5. jmap conecta al socket y envía el comando dumpheap .

  6. Este comando es leído y ejecutado por el hilo AttachListener de la JVM. Toda la salida se envía de vuelta al socket. Debido a que JVM hace directamente el volcado de almacenamiento en el proceso, la operación es realmente rápida. Sin embargo, JVM solo puede hacerlo en puntos de seguridad . Si no se puede llegar a un punto de seguridad (por ejemplo, si el proceso está bloqueado, no responde o si hay un GC largo en progreso), jmap esperará y fallará.

Resummos los beneficios y los inconvenientes de Dynamic Attach.

Pros.

  • Dump Hemp y otras operaciones se ejecutan en colaboración por JVM a la velocidad máxima.
  • Puede usar cualquier versión de jmap o jstack para conectarse a cualquier otra versión de JVM.

Contras.

  • La herramienta debe ser ejecutada por el mismo usuario ( euid / egid ) como la JVM objective.
  • Se puede usar solo en JVM en vivo y saludable.
  • No funcionará si la JVM de destino se inicia con -XX:+DisableAttachMechanism .

jmap -F / jstack -F

Cuando se ejecuta con -F las herramientas cambian a modo especial que cuenta con HotSpot Serviceability Agent . En este modo, el proceso objective está congelado; las herramientas leen su memoria a través de las instalaciones de depuración del sistema operativo, es decir, ptrace en Linux.

  1. jmap -F invoca PTRACE_ATTACH en la JVM de destino. El proceso objective se suspende incondicionalmente en respuesta a la señal SIGSTOP .

  2. La herramienta lee la memoria JVM utilizando PTRACE_PEEKDATA . ptrace puede leer solo una palabra a la vez, por lo que se requieren demasiadas llamadas para leer el gran montón del proceso objective. Esto es muy, muy lento.

  3. La herramienta reconstruye las estructuras internas de JVM basándose en el conocimiento de la versión de JVM particular. Como las diferentes versiones de JVM tienen diferentes jmap memoria, el modo -F funciona solo si jmap proviene del mismo JDK que el proceso de Java de destino.

  4. La herramienta crea un volcado dynamic y luego reanuda el proceso objective.

Pros.

  • No se requiere cooperación de JVM objective. Se puede usar incluso en un proceso colgado.
  • ptrace funciona cuando los privilegios de nivel de sistema operativo son suficientes. Por ejemplo, root puede volcar procesos de todos los demás usuarios.

Contras.

  • Muy lento para grandes montones.
  • La herramienta y el proceso de destino deben ser de la misma versión de JDK.
  • El punto de seguridad no está garantizado cuando la herramienta se conecta en modo forzado. Aunque jmap intenta manejar todos los casos especiales, a veces puede suceder que la JVM objective no esté en un estado consistente.

Nota

Hay una forma más rápida de realizar volcados de almacenamiento en el modo forzado. Primero, crea un coredump con gcore , luego ejecuta jmap sobre el archivo core generado. Ver la pregunta relacionada .

Acabo de descubrir que jmap (y presumiblemente jvisualvm al usarlo para generar un volcado de almacenamiento dynamic) impone que el usuario que ejecuta jmap debe ser el mismo usuario que ejecuta el proceso que intenta ser objeto de dumping.

en mi caso, el jvm quiero un volcado de stack para el usuario de Linux “jboss”. entonces donde sudo jmap -dump:file.bin informaba “No se puede abrir socket:”, pude tomar mi volcado de heap usando:

 sudo -u jboss jmap -dump:file.bin  

Al igual que dijo ben_wing , puedes ejecutar con:

 sudo -u jboss-as jmap -dump:file.bin  

(En mi caso, el usuario es jboss-as , pero el tuyo podría ser jboss o algún otro).

Pero no fue suficiente, porque me pidió una contraseña ( [sudo] password for ec2-user: , aunque podría ejecutar sudo sin pedirme una contraseña con otros comandos.

Encontré la solución aquí , y solo necesitaba agregar otro sudo primero:

 sudo sudo -u jboss-as jmap -dump:file.bin  

Funciona con otros comandos como jcmd y jinfo también.