via varios socket servidor recibir por pasar mediante enviar con cliente bytes archivos java linux jvm jvm-hotspot

varios - sockets en java cliente servidor netbeans



Ejecutando jmap obteniendo No se puede abrir el archivo de socket (4)

Tuve que ejecutar jmap para tomar el volcado de montón 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 realizar un volcado de almacenamiento dinámico?
  2. Estoy esperando 20 minutos y aún no he terminado. Alguna idea de por qué?

Acabo de encontrar que jmap (y presumiblemente jvisualvm cuando se usa para generar un volcado de montón) impone que el usuario que ejecuta jmap debe ser el mismo usuario que ejecuta el proceso que intenta ser volcado.

en mi caso, el usuario de Linux "jboss" está ejecutando el jvm para el que quiero un volcado de almacenamiento dinámico. entonces, donde sudo jmap -dump:file.bin <pid> informaba "No se puede abrir el socket:", pude tomar mi volcado de montón usando:

sudo -u jboss jmap -dump:file.bin <pid>


Si su aplicación se está ejecutando como un servicio systemd. Debe abrir el archivo de servicio que se encuentra en /usr/lib/systemd/system/ y nombrado por su nombre de servicio. Luego verifique si el atributo privateTmp es verdadero.

Si es verdadero, debe cambiarlo a falso, luego actualizar el servicio mediante el comando de la siguiente manera: systemctl daemon-reload systemctl restart [servicename] Si desea ejecutar jmap / jcmd antes de reiniciar, puede usar el script execStop en el servicio archivo. Simplemente systemctl stop [service name] comando y ejecute systemctl stop [service name]


Tal como dijo ben_wing , puedes correr con:

sudo -u jboss-as jmap -dump:file.bin <pid>

(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 podía ejecutar sudo sin pedirme una contraseña con otros comandos.

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

sudo sudo -u jboss-as jmap -dump:file.bin <pid>

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


jmap vs. jmap -F , así como jstack vs. jstack -F utilizan mecanismos completamente diferentes para comunicarse con la JVM de destino.

jmap / jstack

Cuando se ejecuta 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 de destino o en /tmp .

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

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

  4. Por razones de seguridad cuando se acepta una conexión (desde jmap ), JVM verifica que las credenciales del igual de socket sean iguales a euid y egid del proceso JVM. Es por eso que jmap no funcionará si es ejecutado por 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 zócalo. Dado que JVM realiza el volcado del montón directamente en el proceso, la operación es realmente rápida. Sin embargo, JVM puede hacer esto solo en safepoints . Si no se puede alcanzar un punto seguro (p. Ej., El proceso está bloqueado, no responde o hay un GC largo en progreso), jmap y fallará.

Resumamos los beneficios y los inconvenientes de Dynamic Attach.

Pros

  • JVM ejecuta de forma colaborativa el volcado de almacenamiento dinámico y otras operaciones 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 ) que la JVM de destino.
  • Solo se puede usar 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 al modo especial que cuenta con HotSpot Serviceability Agent . En este modo, el proceso de destino se congela; las herramientas leen su memoria a través de las funciones de depuración del sistema operativo, es decir, ptrace en Linux.

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

  2. La herramienta lee la memoria JVM usando PTRACE_PEEKDATA . ptrace solo puede leer una palabra a la vez, por lo que se requieren demasiadas llamadas para leer la gran cantidad del proceso de destino. Esto es muy y muy lento.

  3. La herramienta reconstruye estructuras internas de JVM basadas en el conocimiento de la versión particular de JVM. Dado que las diferentes versiones de JVM tienen un diseño de memoria diferente, el modo -F solo funciona si jmap proviene del mismo JDK que el proceso Java de destino.

  4. La herramienta crea un volcado de almacenamiento dinámico y luego reanuda el proceso de destino.

Pros

  • No se requiere la cooperación de JVM objetivo. Se puede usar incluso en un proceso colgado.
  • ptrace funciona siempre que los privilegios a nivel del sistema operativo sean suficientes. Por ejemplo, root puede volcar los 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 seguro 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 de destino no esté en un estado coherente.

Nota

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