Obter despejos de encadeamento de uma JVM

Descrição

Ambiente

  • Experience Manager

Problemas/sintomas
Como obter despejos de threads de uma JVM no Linux, UNIX ou Windows?




 


Um despejo de thread é uma lista de todos os threads Java que estão ativos atualmente em uma JVM (Java Virtual Machine).

Há várias maneiras de obter despejos de encadeamentos de uma JVM. É altamente recomendável ter mais de um despejo de thread. Uma boa prática é realizar 10 despejos de encadeamento em um intervalo regular (por exemplo, um despejo de encadeamento a cada dez segundos).

Resolução

Etapa 1: Obter o PID do seu processo Java

A primeira informação que você precisará para obter um despejo de encadeamento é o PID do seu processo Java.

O JDK do Java é fornecido com o comando jps, que lista todas as IDs do processo Java. Você pode executar este comando da seguinte maneira:

jps -l 70660 sun.tools.jps.Jps 70305

Observação: No Linux e UNIX, talvez seja necessário executar esse comando como sudo -u usuário jps -l, onde "usuário" é o nome de usuário do usuário no qual o processo Java está sendo executado.

Se isso não funcionar ou ainda não for possível encontrar o processo Java (caminho não definido, JDK não instalado ou versão mais antiga do Java), use

  • UNIX, Linux e Mac OS X: ps -el | grep java
  • Windows: Pressione Ctrl+Shift+Esc para abrir o gerenciador de tarefas e encontrar o PID do processo Java

Etapa 2: Solicitar um despejo de thread da JVM

pilha

Se estiver instalado/disponível, recomendamos usar o pilha ferramenta. Ele imprime dumps de encadeamento no console da linha de comando.

Para obter um despejo de thread usando jstack, execute o seguinte comando:
jstack -l pid

Você pode enviar dumps de encadeamento consecutivos para um arquivo usando a diretiva de redirecionamento/anexação de saída do console:
jstack -l pid threaddumps.log

Notas:

  • A ferramenta jstack está disponível desde o JDK 1.5 (para JVM no Windows, está disponível somente em algumas versões do JDK 1.5 e JDK 1.6).

  • jstack funciona mesmo se a variável -Xrs parâmetro jvm está ativado

  • Não é possível usar a ferramenta jstack do JDK 1.6 para obter despejos de encadeamento de um processo em execução no JDK 1.5.

  • No Linux e UNIX, você precisa executar o comando como o usuário proprietário do processo java:

    sudo - u java-user jstack -l pid

    (java-user deve ser substituído pela id do usuário como o processo Java está sendo executado)

  • No Windows, se você executar o jstack e receber o erro "Não há armazenamento suficiente disponível para processar esse comando", você deverá executar o jstack como o usuário do Windows SYSTEM ou o usuário que possui o processo java.  Você pode fazer isso usando o psexec, que pode ser baixado here. Para executar o jstack como usuário SYSTEM, use um comando como este:

    psexec -s jstack pid  threaddumps.log

    Se não conseguir instalar o psexec no servidor, você poderá criar um arquivo .bat contendo o comando e executá-lo usando o agendador de tarefas do Windows (como um usuário diferente).

  • Se o processo java não estiver respondendo, às vezes pode ajudar a usar a opção -J-d64 (em sistemas de 64 bits), por exemplo:

    jstack -J-d64 -l pid  threaddumps.log

  • Se o comando jstack (jstack -l pid threaddumps.log) aciona o erro 1 abaixo e, em seguida, executa o comando como o usuário proprietário do processo java.  Por exemplo:

    sudo -u sling jstack -l pid threaddumps.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)

SCRIPT JSTACK

Aqui está um script (adaptado a partir da eclipse.org) que usará uma série de despejos de encadeamento jstack.  Também utiliza o uso da cpu no nível do thread usando o comando superior.

Faça assim:
sudo - u usuário jstackSeries.sh pid aemserveruser count atraso

Por exemplo:
sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 é o pid do processo Java
  • cq5serveruser é o usuário Linux ou UNIX que o processo Java executa como
  • 10º é quantos despejos de encadeamento utilizar
  • 3 é o atraso entre cada despejo

Observação: A saída superior tem a id de thread nativa em formato decimal, enquanto a saída de jstack tem a nid em hexadecimal.  Você pode corresponder o thread de cpu alto da saída superior à saída de jstack convertendo o id do thread em hexadecimal.

Além do script acima, também temos um Script do Windows Powershell e um Adobe AEM script específico no github.

Ferramenta de despejo de encadeamento para Adobe Experience Manager

Se você estiver usando o produto Adobe Experience Manager, é possível instalar esta ferramenta para ter uma interface de usuário simples para gerar despejos de encadeamento.

MANEIRAS ALTERNATIVAS DE OBTER UM DESPEJO DE ENCADEAMENTO

Se a variável pilha A ferramenta não está disponível para você, então é possível obter despejos de encadeamento da seguinte maneira:

Observação: Algumas ferramentas não podem obter despejos de threads da JVM se o parâmetro da linha de comando -Xrs estiver ativado. Se tiver problemas para obter despejos de encadeamento, verifique se essa opção está habilitada.

UNIX, Mac OS X e Linux (JDK 1.4 ou versão inferior)

No UNIX, no Mac OS X e no Linux, você pode enviar um sinal de QUIT para o processo Java para avisá-lo para enviar um despejo de thread para saída padrão.

  1. Execute este comando para fazer isso:

    kill -QUIT pid

    Talvez seja necessário executar esse comando como sudo -u usuário kill -QUIT pid onde "usuário" é o usuário no qual o processo Java está sendo executado.

  2. Se você estiver iniciando o CQSE usando o crx-quickstart/server/start em seguida, seus dumps de encadeamento serão enviados para crx-quickstart/server/logs/startup.log. Se você estiver usando um servidor de aplicativos de terceiros, como JBoss, WebSphere, Tomcat ou outro, consulte a documentação do servidor para descobrir a qual arquivo o resultado padrão é direcionado.

Windows:
JDK 1.X

  1. Baixe javadump.exe (anexado abaixo).

  2. Inicie a JVM com estes três argumentos (eles devem estar na ordem correta):

    -XX:+UnlockDiagnosticVMOoptions -XX:+LogVMOutput -XX:LogFile=C:\temp\jvmoutput.log

  3. Pressione Ctrl+Shift+Esc para abrir o Gerenciador de tarefas.

  4. Encontre o PID do processo Java.

  5. Na linha de comando, execute

    javadump.exe pid

  6. O despejo de encadeamento aparecerá no jvmoutput.log arquivo mencionado na etapa 2.


JDK 1.6

Obter um despejo de thread de jconsole usando um plug-in: 0

Veja como solicitar um despejo de encadeamento:

  1. Adicione o seguinte parâmetro ao jvm executando o Communique : -Dcom.sun.management.jmxremote

  2. Baixe e instale o JDK 1.6 (se ainda não tiver sido feito).

  3. Baixe e extraia o Utilitário Analisador de despejo de encadeamento. 1

  4. Executar jconsole.exe do JDK 1.6:

    jconsole.exe -pluginpath /path/to/file/tda.jar

  5. Clique no botão Despejos de thread guia .

  6. Clique no botão Solicitar despejo de encadeamento link .

Observação: Se você estiver executando AEM 6.* e para observar os threads em execução, você pode solicitar http://host:port/system/console/status-Threads para obter uma lista de encadeamentos. No entanto, observe que esses dumps de encadeamento não funcionarão com ferramentas de análise de despejo de encadeamento, como samurai ou tda.

Aplica-se a

Todos os produtos Adobe em execução em uma JVM

Ferramentas de análise de despejo de encadeamento:

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
1  https://github.com/irockel/tda
https://fastthread.io/
https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm

Nesta página