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 ...
-
¿Usar
-F
está bien para realizar un volcado de almacenamiento dinámico? - 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.
-
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
. -
Entonces
jmap
envíaSIGQUIT
al proceso de destino. Cuando JVM capta la señal y encuentra.attach_pid1234
, inicia el subprocesoAttachListener
. -
AttachListener
subprocesoAttachListener
crea el socket de dominio UNIX/tmp/.java_pid1234
para escuchar comandos de herramientas externas. -
Por razones de seguridad cuando se acepta una conexión (desde
jmap
), JVM verifica que las credenciales del igual de socket sean iguales aeuid
yegid
del proceso JVM. Es por eso quejmap
no funcionará si es ejecutado por un usuario diferente (incluso por root). -
jmap
conecta al socket y envía el comandodumpheap
. -
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
ojstack
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.
-
jmap -F
invocaPTRACE_ATTACH
en la JVM de destino. El proceso de destino se suspende incondicionalmente en respuesta a la señalSIGSTOP
. -
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. -
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 sijmap
proviene del mismo JDK que el proceso Java de destino. -
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
.