As seguintes instruções são centradas no Linux:
- Identifique o processo com falha / preso
No seu caso, o processo está no estado S
, que significa man ps
:
S sleep interrompível (esperando que um evento seja concluído)
Então, sim, provavelmente está aguardando que alguma operação de rede ou sistema de arquivos seja concluída.
- Rastreie chamadas e sinais do sistema com
strace
Anexe o programa strace
ao encadeamento suspenso executando:
# strace -p
Isso mostrará a você, em tempo real, as ações ou, mais precisamente, as syscalls executadas pelo programa, por exemplo, você poderá ver um loop com open()
retornando um erro como ENOENT
significa que um arquivo em particular não está lá.
Sua saída ps
indica que o processo não está consumindo CPU (3ª coluna), portanto, o problema aqui provavelmente não está relacionado a um loop, mas apenas a uma operação de espera, como um arquivo bloqueado, aguardando um soquete ou um externo ação.
-
kill
e coredumps
O programa kill
, que é usado para enviar um sinal particular para um programa em execução está longe de ser relacionado ao java, ele pode muito bem ser usado para enviar o sinal 3 ( SIGQUIT
) que fechará o programa e gere um arquivo core
.
A geração de um arquivo core
é permitida apenas se as permissões corretas de ulimit
estiverem em vigor, verifique com o comando ulimit -c
. Se ele diz 0
, você deve modificá-lo, por exemplo, para unlimited
:
ulimit -c unlimited
Só então você deve reiniciar o aplicativo e provocar um coredump enviando um kill -3
.