Primeiro quero ressaltar que minha situação não é nada trivial. A situação é a seguinte:
Tenho um programa que inicializa algumas threads para executar uma série de instruções. Assim que elas terminam, as threads morrem, aguarda-se uns 5 minutos e depois começa tudo de novo. Até aí, tudo bem. Só que depois de umas 12 horas, as threads entram em estado de waiting. Tempos a atrás isso significava que algumas conexões JDBC ficavam abertas, e quando chegam em um certo número, a thread ficava em tal estado. Só que na situação atual, já verifiquei se existem conexões abertas, e nada, logo gostaria de saber se alguém tem alguma sugestão o que poderiam levar a esse estado de waiting.
Vixi cara, existem tantas situações p/ isso q daria p/ escrever livros sobre o assunto…
Vc já fez profile do processo?
As threads compartilham recursos entre si? Se sim, as classes compartilhadas são REALMENTE threadsafe? [mais provável]
Há chances de dispositivos I/O estarem travando o processo? (ex: leitura/escrita de arquivos, acesso jdbc, etc) [menos provável]
A possibilidade maior q eu vejo é q existe algum caso bem específico causando deadlock entre elas…
O d daria p/ fazer tb é logar as classes e threads envolvidas e qdo der o problema, ir no log e refazer mentalmente o processo das threads (é um saco, mas fazer o q?)
ViniGodoy
Rode seu programa com o console aberto. Quando tudo ficar em waiting, aperte CTRL+Break. Verifique se lá algum deadlock foi detectado.
Ezequielll
ViniGodoy, rodar o programa em debug no meu caso, não é viável tento em vista que ele demora em torno de 12 horas para entrar em estado de waiting. Talvez seja melhor mesmo acompanhar os logs.
Barenko, as threads não compartilham recursos entre si, não existem nem métodos e variaveis em comum. Logo não existe a necessidade de serem threadsafe.
Agora você levantou duas questões interessantes, que gostaria que explicasse, se possível, é claro.
A primeira é: como faz profile do processo? Talvez faço isso e não sei que recebe esse nome… rs
A segunda é: como sei que dispositivos I/O estão travando o processo? Tem algum teste com resultado rápido, que posso fazer isso?
ViniGodoy
Use o visual VM. Em modo debug, se você usar o profiler do Netbeans, é possível até mesmo dar um “pause” na thread e ver em que ponto ela está parada. Se o programa leva só 12 horas para travar, deixe-o rodando por uma noite e na manhã seguinte vc terá o resultado.
Você usa que tipos de dispositivos de I/O? Disco? Sockets?
Ezequielll
ViniGodoy, sobre o visual VM nem tinha conhecimento, vou estudá-lo e testá-lo.
Agora, sobre os dispositivos de I/O não sei te falar direito, pois estou na manutenção de um grande projeto…
sei que usa JDBC para salvar os dados no banco e as vezes usa java.io.FileInputStream e java.io.InputStream. Logo gostaria de saber o que devo olhar para saber o tipo de dispositivo I/O utilizado?
barenko
Profilers:
No netbeans, tem o profile nativo. Se vc usa eclipse, basta instalar o TPTP q são fornecidas qse as mesmas características (se puder escolher, teste no netbeans, pois o profiler dele é bem mais leve e muito melhor).
Eu não conhecia esse visualVM, interessante, vou dar uma olhada.
lina
Oi,
Está cheirando JavaHeap - OutOfMemory. Quem sabe algum objeto está ficando “armazenado” virtualmente e o GC não está resolvendo.
Acompanhe com o Visual VM e coloque um GC na saida (após o wait) de sua Thread. Verifique se o Heap irá normalizar quando você forçar a utilização do System.gc();
Tchauzin!
ViniGodoy
É muito parecido com o profiler do Netbeans. A grande vantagem é que ele já vem no JDK 6.