VisualVM - Analisando aplicações Java

O VisualVM é uma excelente ferramenta que já vem por padrão no JDK 6 update 7 mas que, infelizmente, poucos desenvolvedores conhecem.

O James Sugrue escreveu um ótimo artigo sobre a ferramenta na DZone e ainda utilizou o VisualVM para comparar as IDEs IntelliJ, Eclipse e Netbeans.

http://java.dzone.com/articles/best-kept-secret-jdk-visualvm

Testei aqui e gostei muito.

Muito simples de usar, facinho coloquei no Eclipse.

Pena que não há nenhum tutorial brazuca pra ajudar a galera por aqui.

Show de bola, vou fazer uns testes em casa! :smiley:

Quem sabe não surge um material em BR :wink:

Boa ferramenta!

além disso quem comentar sobre ela como o James fez estará concorrendo a $500,00.

http://java.sun.com/community/javavisualvm/?cid=927509

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?

Tem um pacote chamado Instrument, que serve para isso:
http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html

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.).

O Fato é o Seguinte:

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...");