Nós escrevemos um plugin para ele aqui para monitorar o tempo gasto por thread, no processador. Isso ajudou a identificar que thread estava travada em um loop, por exemplo.
Realmente, uma ferramenta muito boa.
Mas boa parte de profiling está presente no Netbeans, e com muito mais facilidades.
[quote=ViniGodoy]Nós escrevemos um plugin para ele aqui para monitorar o tempo gasto por thread, no processador. Isso ajudou a identificar que thread estava travada em um loop, por exemplo.
Realmente, uma ferramenta muito boa.
Mas boa parte de profiling está presente no Netbeans, e com muito mais facilidades.[/quote]
Vini, estou com a necessidade de implementar um serviço que faça justamente isso: Identifique as threads do servidor TomCat que estão com um tempo maior que alguns minutos e mate-as.
Consegui através do PSI-Probe TomCat identificar que em certos momentos algumas threads ficam Zumbi no Servidor e na aba Connectores(do Probe), mato- as manualmente.
Queria que meu agente ficasse lenda as threads ocupadas e dado um limite aceitável meu, mate estas threads.
Alguma dica se com a biblioteca do VisualVM ou na propria VM eu consiga implementar esse serviço?
Mas, no meu caso, não matava nenhuma thread zumbi. É melhor ir até o código da thread e descobrir por que ela fica inconsistente assim. Mata-la não necessariamente vai liberar os recursos que a thread estiver segurando (cursores de banco, arquivos abertos, etc.).
Faço uma Requisição com HttpClient, dentro de uma Conexão SSL.
Este codigo está +/- assim:
O GetMethod.releaseConnection não está sendo efetivo para liberar o recurso, mantendo ela busy eternamente…
O que posso fazer neste caso?
logger.info("Iniciou a pesquisa...");
org.apache.commons.httpclient.HttpClient httpClient = new org.apache.commons.httpclient.HttpClient();
GetMethod get = null;
try {
get = new GetMethod("url de destino");
HttpConnectionParams timeOut = new HttpConnectionParams();
timeOut.setSoTimeout(30000);
httpClient.executeMethod(get);
} catch (HttpException e) {
logger.fatal("Falha na requisição.",e);
} catch (IOException e) {
logger.fatal("Falha na requisição.",e);
}finally{
//Isso não está sendo efeivo, ficam threads penduradas mesmo fazendo isso para todos os method's requisitados
get.releaseConnection();
}
logger.info("Finalizou a pesquisa...");