O desenvolvimento de aplicacoes em Java e a otimizacao e algo que requer uma atencao muito especial. Muitos por ai falam que odeiam o Java falando que e muito dificil de desenvolver, que tem problema de uso de memoria e etc.Os programadores Java que me desculpem, mas estou comecando a achar que o problema nao esta no Java e sim na forma como se desenvolve e como se implanta o sistema. Acrescento ainda, o problema vem desde a Faculdade, onde nao se fala absolutamente nada sobre otimizacao e analise de desempenho de aplicacoes.Antes de liberar o sistema para a producao e extremamente importante fazer uma analise geral do funcionamento da aplicacao, do uso de CPU, de memoria e o numero de threads geradas, para saber se a aplicacao esta alocando e desalocando os recursos corretamente, abrindo e fechando as threads, etc.Bom, mas vamos ao que interessa. Como fazer para monitorar a sua JVM?Para iniciar e necessario prepararmos a JVM para ser monitorada. Neste exemplo vou utilizar o servidor de aplicacao Jetty rodando em um servidor Linux na pasta /opt/jetty.Abra o arquivo jetty.sh que esta dentro da pasta /opt/jetty/bin/ e adicione a seguinte variavel no comeco do arquivo (apos os comentarios):JAVA_OPTIONS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"Explicando cada parametro:-Dcom.sun.management.jmxremote: Habilita o gerenciamento remoto-Dcom.sun.management.jmxremote.port=8086: Porta que sera usada para conexao-Dcom.sun.management.jmxremote.ssl=false: Habilitar ou nao o SSL-Dcom.sun.management.jmxremote.authenticate=false: Se havera necessidade de autenticacao para se conectar na JVMFeito isto, basta iniciar o seu Jetty usando o script jetty.sh:/opt/jetty/bin/jetty.sh startO seu Jetty vai iniciar e permitira que voce se conecte remotamente na JVM para fazer o monitoramento.Outra opcao para iniciar o jetty e executar diretamente na linha de comando:java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /opt/jetty/start.jarPara o monitoramento utilizaremos a excelente ferramenta da Sun chamada VisualVM. Nao sei se e a melhor, mas atendeu as minhas necessidades e resolveu os meus problemas. :)Execute o comando jvisualvm em qualquer maquina que tenha uma JVM instalada. No meu caso, uso Mac OS X Snow Leopard para o monitoramento.Tela inicial do VisualVMNa coluna na lateral esquerda execute os seguintes passos para adicionar o seu servidor remoto:Clica com o botao direito em RemoteClica em Add Remote Host...Coloca o IP ou nome da maquina a ser monitorada no campo e clica em OKClica com o botao direito no Host adicionadoClica em Add JMX Connection...Preencha o campo Connection com IP:PORTA, onde a porta e a que foi adicionada no JAVA_OPTIONS do Jetty, no meu caso 8086, e depois clica em OKPronto, a sua JVM ja vai ser monitorada. Voce podera acompanhar na aba Monitor em tempo real a utilizacao de CPU, Heap Size, numero de classes e numero de threads.Na aba Threads, e possivel monitorar os threads em tempo real.Um recurso muito util para descobrir problemas de ma utilizacao de memoria e fazer um dump das threads e analisar qual a thread que esta ficando presa e qual classe que foi executada para causar o travamento da thread.Para fazer um thread dump, basta clicar com o botao direito no IP do servidor monitorado e clicar em Thread Dump.Ele vai gerar um dump de todas as threads rodando na