Thread 100%

Olá, possuo uma aplicação que está sendo executada pela linha de comando. E ao executar a mesma, em certo momento a cpu chega a 100% de utilização, como eu posso depurar para achar qual das threads está executando em 100%? Estava tentando utilizar o visualvm mas não estou me achando com ele.

Alguem teria mais alguma sugestão?

Olá!

Tente usar algum profiler. Recomendo o JProfile (http://www.ej-technologies.com/products/jprofiler/overview.html), ele é pago, porém disponibilizam uma versão Trial que aparentemente não tem (pelo menos não tinha) ‘corte’ nenhum em relação a versão paga e conseguiu me atender perfeitamente.

[quote=spiderman]Olá, possuo uma aplicação que está sendo executada pela linha de comando. E ao executar a mesma, em certo momento a cpu chega a 100% de utilização, como eu posso depurar para achar qual das threads está executando em 100%? Estava tentando utilizar o visualvm mas não estou me achando com ele.

Alguem teria mais alguma sugestão?[/quote]

Se não me engano, a Thread que vai a 100% é normalmente a que está mias tempo no estado Running e a que, nos tempos de CPU, é que ocupa o maior tempo.

Esse tipo de comportamento ocorre quando você está executando algum loop que espera alguma alteração no sistema para parar:

while( testaSeAlgumaCoisaOcorre() ) { //Enquanto essa alguma coisa não ocorre: // - você altera algumas variáveis // - você imprime algo na console // - Não faz o loop esperar um pouco a cada iteração // - como um Thread.sleep(10) // - ou wait(10). Neste caso, teria, talvez, a necessidade de um notify() // - Ou o pior dos cenários, não há nada implementado aqui. }
Exemplos:

while( testaSeAlgumaCoisaOcorre() ) { } while( testaSeAlgumaCoisaOcorre() ) { if(outraCoisaQueRetornaSempreFalso()) { variavel = getValor(); } } while( testaSeAlgumaCoisaOcorre() ) { if(outraCoisa()) { //AS vezes true, as vezes false variavel = getValor(); } }