Entorno
Experience Manager
¿Cómo tomar volcados de subprocesos de una JVM en Linux, UNIX o Windows?
Un volcado de subprocesos es una lista de todos los subprocesos Java que están activos actualmente en una máquina virtual Java (JVM).
Existen varias formas de tomar volcados de subprocesos de una JVM. Se recomienda encarecidamente tomar más de un volcado de subprocesos. Una práctica recomendada es tomar 10 volcados de subprocesos a intervalos regulares (por ejemplo, un volcado de subprocesos cada diez segundos).
Paso 1: Obtención del PID de su proceso Java
La primera información que necesitará para obtener un volcado de subprocesos es el PID de su proceso Java.
El JDK de Java se envía con el comando jps que enumera todos los ID de proceso de Java. Puede ejecutar este comando de esta manera:
jps -l 70660 sun.tools.jps.Jps 70305
Nota: En Linux y UNIX, es posible que tenga que ejecutar este comando como sudo -u user jps -l, donde "usuario" es el nombre de usuario del usuario con el que se ejecuta el proceso Java.
Si esto no funciona o todavía no puede encontrar su proceso Java (ruta no establecida, JDK no instalado o versión anterior de Java), utilice
Paso 2: Solicitar un volcado de subprocesos de JVM
jstack
Si está instalado/disponible, se recomienda usar la variable jstack herramienta. Imprime volcados de subprocesos en la consola de línea de comandos.
Para obtener un volcado de subprocesos usando jstack, ejecute el siguiente comando:
jstack -l <
pid>
Puede generar volcados de subprocesos consecutivos en un archivo utilizando la directiva de redireccionamiento/anexado de salida de la consola:
jstack -l <
pid>
>
>
threadvolps.log
Notas:
La herramienta jstack está disponible desde JDK 1.5 (para JVM en Windows, solo está disponible en algunas versiones de JDK 1.5 y JDK 1.6).
jstack funciona incluso si la variable -Xrs
el parámetro jvm está habilitado
No es posible utilizar la herramienta jstack de JDK 1.6 para tomar los volcados de subprocesos de un proceso que se ejecuta en JDK 1.5.
En Linux y UNIX, debe ejecutar el comando como el usuario propietario del proceso java:
sudo -u java-user jstack -l <
pid>
(<
java-user>
debe reemplazarse por el id del usuario con el que se ejecuta el proceso Java)
En Windows, si ejecuta jstack y obtiene el error "No hay suficiente almacenamiento disponible para procesar este comando", debe ejecutar jstack como usuario de windows SYSTEM o como usuario propietario del proceso java. Puede hacerlo utilizando psexec, que puede descargar here. Para ejecutar jstack como usuario SYSTEM, utilice un comando como este:
psexec -s jstack <
pid>
>
>
threadvolps.log
Si no puede instalar psexec en el servidor, puede crear un archivo .bat que contenga el comando y ejecutarlo uso del programador de tareas de Windows (como usuario diferente).
Si el proceso java no responde, a veces puede ayudar a utilizar la opción -J-d64 (en sistemas de 64 bits), por ejemplo:
jstack -J-d64 -l <
pid>
>
>
threadvolps.log
Si el comando jstack (jstack -l <
pid>
>
>
threadvolps.log) genera el error [
1]
a continuación, ejecute el comando como el usuario propietario del proceso java. Por ejemplo:
sudo -u sling jstack -l <
pid>
>
>
threadvolps.log
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
SECUENCIA DE COMANDOS DE JSTACK
Aquí tiene un script (adaptado a la versión eclipse.org) que tomará una serie de volcados de subprocesos usando jstack. También toma el uso de la cpu a nivel de subproceso usando el comando superior.
Simplemente ejecútelo así:
sudo -u *<
usuario>
*jstackSeries.sh <
pid>
<
aemserveruser>
<
count>
<
delay>
Por ejemplo:
sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3
Nota: La salida superior tiene el id de subproceso nativo en formato decimal, mientras que la salida de jstack tiene el valor nid en hexadecimal. Puede hacer coincidir el subproceso de cpu superior de la salida superior con el resultado de jstack convirtiendo el id de subproceso en hexadecimal.
Además del script anterior, también tenemos un Windows Powershell script y un Adobe AEM script específico en github.
Herramienta de volcado de subprocesos para Adobe Experience Manager
Si utiliza el producto Adobe Experience Manager, puede instalar esta herramienta para tener una interfaz de usuario sencilla para generar volcados de subprocesos.
MANERAS ALTERNATIVAS DE OBTENER UN VOLCADO DE SUBPROCESOS
Si la variable jstack La herramienta no está disponible, por lo que puede tomar volcados de subprocesos de la siguiente manera:
Nota: Algunas herramientas no pueden tomar volcados de subprocesos de la JVM si el parámetro de línea de comandos -Xrs
está activada. Si tiene problemas para tomar volcados de subprocesos, compruebe si esta opción está habilitada.
UNIX, Mac OS X y Linux (JDK 1.4 o versión inferior)
En UNIX, Mac OS X y Linux, puede enviar una señal QUIT al proceso Java para indicarle que envíe un volcado de subprocesos a la salida estándar.
Ejecute este comando para hacer esto:
kill -QUIT <
pid>
Es posible que necesite ejecutar este comando como sudo -u user kill -QUIT <
pid>
donde "usuario" es el usuario con el que se ejecuta el proceso Java.
Si está iniciando el CQSE utilizando la variable crx-quickstart/server/start script, entonces los volcados de subprocesos se emitirán a crx-quickstart/server/logs/startup.log. Si utiliza un servidor de aplicaciones de terceros como JBoss, WebSphere, Tomcat u otro, consulte la documentación del servidor para averiguar a qué archivo se dirige la salida estándar.
Windows:
JDK 1.X
Descargue javadump.exe (adjunto abajo).
Inicie la JVM con estos tres argumentos (deben estar en el orden correcto):
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C:\temp\jvmoutput.log
Pulse Ctrl+Mayús+Esc para abrir el Administrador de tareas.
Busque el PID del proceso Java.
Desde la línea de comandos, ejecute
javadump.exe <
pid>
El volcado de subprocesos aparecerá en el jvmoutput.log
archivo mencionado en el paso 2.
JDK 1.6
Obtener el volcado de subprocesos de jconsole mediante un complemento: [
0]
Así puede solicitar un volcado de subprocesos:
Añada el siguiente parámetro al jvm que ejecuta Communique : -Dcom.sun.management.jmxremote
Descargue e instale JDK 1.6 (si aún no lo ha hecho).
Descargue y extraiga el Utilidad de análisis de volcado de subprocesos. [
1]
Ejecutar jconsole.exe
de JDK 1.6:
jconsole.exe -pluginpath /path/to/file/tda.jar
Haga clic en el Volcados de subprocesos pestaña .
Haga clic en el Solicitar descarga de subproceso vínculo.
Nota: Si está ejecutando AEM 6.* y desea observar los subprocesos en ejecución, puede solicitar http://
< host
> :
< port
> /system/console/status-Threads
para obtener una lista de subprocesos. Sin embargo, tenga en cuenta que estos volcados de subprocesos no funcionarán con herramientas de análisis de volcado de subprocesos como samurai o tda.
Se aplica a
Todos los productos de Adobe que se ejecutan en una JVM
Herramientas de análisis de volcado de subprocesos:
[
0]
PsExec v2.42 en Sysinternals en la documentación de Microsoft.
[
1]
TDA: Analizador de volcado de subprocesos en irockel/tda en Github.com.
[
2]
Analizador de volcado de subprocesos Java en FastThread.
[
3]
Analizador de volcado de subprocesos y monitores de IBM para Java en la documentación del Asistente de asistencia de IBM.