O que esse processo Java realmente faz?

O script a seguir fornece uma maneira fácil de recuperar o stacktrace de um encadeamento Java / JVM que é identificado pelo Linux ‘LWPID (Light Weight ProcessID).

Isso é útil em uma situação em que o processo Java no Linux está consumindo muita CPU. Você pode obter o LWPID do thread específico, por exemplo, executando “top -H”.

Tendo o LWPID do thread, escrevi o seguinte script para me fornecer informações detalhadas, como informações completas do processo (de ‘ps -ef’) e rastreamento de pilha do thread:

#!/bin/bash
# This Script will try to return the Java Thread belonging to the specified LWPID (Light Weight ProcessID).
# Therefore it will find the PID (processID) of the specified LWPID, create a threaddump of this PID
# (which is assumed to be a JVM process) and grep the threaddump for the hexadecimal representation of the LWPID.
#
# Usage: sudo -u <APPLICATION_SHELL_USER> /path/to/getJavaThreadStack.sh <LWPID>

# Path to the "jstack" utility which comes with the JDK. Usually it is $JAVA_HOME/bin/jstack
JSTACK
=jstack
LWPID
=$1

# If LWPID hasn't been specified, get the LWPID of the thread consuming the most CPU (via 'top -H')
if [[ -z "$LWPID" ]]; then
LWPID
=$(top -n1 -H | grep -m1 java | perl -pe 's/e[?.*?[@-~] ?//g' | cut -f1 -d' ')
fi

# hexadecimal presentation of the LWPID
NID
=$(printf '%x' $LWPID)

# get the process listing containing the current LWPID ('grep java' is necessary because grep on the process list always also finds the 'grep process' itself)
COMMAND_LINE
=$(ps -efL | grep $LWPID | grep java)

# print out the command line so the user knows which OS process actually contains the specified LWPID
echo $COMMAND_LINE


# retrieve the PID (processID) from the COMMAND_LINE
PID
=$(echo $COMMAND_LINE | perl -pe 's/e[?.*?[@-~] ?//g' | awk '{print $2}')

# get the thread dump of the JVM and grep for the hexadecimal presentation of the LWPID (a.k.a. NID)
$JSTACK
-F $PID | grep -A500 $NID | grep -m1 '^$' -B 500

NOTA: jstack só imprimirá o rastreamento de pilha do encadeamento se o aplicativo Java tiver sido compilado com o sinalizador de depuração habilitado!