Ambiente
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).
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
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
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.
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.
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
Baixe javadump.exe (anexado abaixo).
Inicie a JVM com estes três argumentos (eles devem estar na ordem correta):
-XX:+UnlockDiagnosticVMOoptions -XX:+LogVMOutput -XX:LogFile=C:\temp\jvmoutput.log
Pressione Ctrl+Shift+Esc para abrir o Gerenciador de tarefas.
Encontre o PID do processo Java.
Na linha de comando, execute
javadump.exe pid
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:
Adicione o seguinte parâmetro ao jvm executando o Communique : -Dcom.sun.management.jmxremote
Baixe e instale o JDK 1.6 (se ainda não tiver sido feito).
Baixe e extraia o Utilitário Analisador de despejo de encadeamento. 1
Executar jconsole.exe
do JDK 1.6:
jconsole.exe -pluginpath /path/to/file/tda.jar
Clique no botão Despejos de thread guia .
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:
0 http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
1 https://github.com/irockel/tda
2 https://fastthread.io/
3 https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm