Pergunta

Eu tenho usado o wrapper Serviço de Java em um aplicativo personalizado por um bom tempo e tem sido funcionando bem. Desde atualizar nossa aplicação para uma nova versão nos últimos dias, a JVM começou a andar e depois invólucro impressões isso no log: JVM aparece pendurado:. Excedeu a aguardar sinal da JVM

Em seguida, termina automaticamente o JVM e inicia o aplicativo novamente. Isso acontece após cerca de 10 horas de funcionamento, o que só torna mais difícil para depurar.

É claro que eu vou olhar através das mudanças que fizemos, mas sem grandes mudanças foram feitas, que eu suspeito está causando esse tipo de problema.

Onde posso olhar para tentar descobrir o que está acontecendo? mensagens de depuração da aplicação não indicam nada de interessante. Se a JVM só trava geralmente vai criar um despejo, que pode ajudar na depuração-lo, mas ele está pendurado, então não é a criação de uma lixeira. Se eu torná-lo não reiniciar automaticamente o serviço é algo que eu possa fazer para obter alguma informação útil para fora da JVM antes de reiniciá-lo?

Parece-me que a JVM não deve pendurar de erros de programação típicos. O que você correr para antes que isso possa causar a JVM para pendurar?

Foi útil?

Solução 4

Eu tinha um par diferentes versões de uma biblioteca no classpath (JBPM). Com envoltório você pode usar curingas para incluir frascos. Tenha cuidado com este embora como você pode incluir acidentalmente mais do que deveria.

Aqui está um artigo da IBM que fornece informações sobre depuração trava em Java . Ele basicamente diz que há duas coisas que podem causar trava:

  1. Um loop infinito,
  2. Um impasse.

Desde então eu tive para depurar outros problemas de suspensão. No Linux, você pode enviar a JVM o sinal de PARE para ele fazer um depósito de fio para o console. Isso realmente ajuda a descobrir onde é o problema. Utilize este comando para fazer isso: matança de -sair

Editar 2017/06/13

Estes dias eu uso jmap incluídos no JDK para despejar toda a memória do programa. Então eu uso Eclipse Memória Analyzer para ver o estado exato do programa quando ele caiu. Você pode olhar para a lista de tópicos que estão ativos e, em seguida, inspecionar as variáveis ??em cada quadro de pilha.

/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID>

Onde PID é o ID do processo do processo de java.

Outras dicas

Leia a wrapper.ping.timeout propriedade . Os comunica software invólucro com o seu JVM vez em quando para se certificar de que ela está viva. Se essa comunicação falhar por qualquer motivo, os Deems invólucro o processo pendurado e tentativas de reiniciá-lo.

Dependendo de como o aplicativo é arquitetado, o JVM pode ser processamento algo ocupado pessoa quando as tentativas de mensagens publicitárias para "ping"-lo.

Veja se você pode usar o Visual VM para ver o que está acontecendo. Ter o Visual VM monitorar o aplicativo durante todo o tempo e quando ele pára de funcionar, talvez, você pode determinar o que está errado.

Se os trava VM você pode obter o estado dos fios ... Eu acho que o Visual VM irá torná-lo um pouco mais fácil dada a sua configuração do que o habitual ctrl-break (ou whatver a combinação de teclas é).

(Edit com base no comentário)

Tentámos este. A última vez que desligou o número de fios e a quantidade de memória em uso foram bastante baixas, de modo nem de quem está fazendo com que o problema. Infelizmente, após ele trava e invólucro termina-lo você não pode obter um despejo fio.

Existe alguma maneira você pode executá-lo sem o invólucro de depurá-lo? Além disso, se você usar o NetBeans Profiler que poderia lhe dar uma chance para lidar com ele quando ele pára (Vou verificar mais tarde hoje e ver se posso descobrir se isso iria se comportar de forma diferente).

Que ambiente você está? OS, versão JVM, arquitetura de hardware?

Isso soa como um bug, e dado que leva muitas horas, soa como um bug de recursos esgotamento de algum tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top