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();
}
}