Performance em Java

10,809 views
10,587 views

Published on

Palestra efetuada por Claudio Miranda no evento Conexão Java 2007
http://www.claudius.com.br

Published in: Technology

Performance em Java

  1. 1. Performance em Aplicações Java Claudio Miranda Summa Technologies Conexão Java 2007
  2. 2. Objetivo Dicas para melhoria de performance em aplicações Java Aprenda técnicas e ferramentas para diagnosticar e resolver problemas de desempenho em um ambiente Java
  3. 3. Objetivo <ul><li>As técnicas mostradas aqui são baseadas na experiência do autor, não necessariamente ela deve ser interpretada como uma receita de bolo unicamente </li></ul>
  4. 4. Agenda <ul><li>Performance em Aplicações e Ambiente </li></ul><ul><li>Compreensão básica do gerenciamento de memória </li></ul><ul><li>Técnicas e ferramentas para diagnóstico </li></ul><ul><li>Dicas </li></ul>
  5. 5. Agenda <ul><li>Performance em Aplicações e Ambiente </li></ul><ul><li>Compreensão básica do gerenciamento de memória </li></ul><ul><li>Técnicas e ferramentas para diagnóstico </li></ul><ul><li>Dicas </li></ul>
  6. 6. Dicas em Performance <ul><li>Ajustes baseados em números </li></ul><ul><ul><li>Tx/s (média de transações por segundo) </li></ul></ul><ul><ul><li>Usuários concorrentes </li></ul></ul><ul><ul><li>Quantidade de sessões </li></ul></ul><ul><li>Armadilhas </li></ul><ul><ul><li>“O mais rápido possível” </li></ul></ul><ul><ul><li>“Está muito lento!” É necessário definir números de performance </li></ul></ul>
  7. 7. Dicas em Performance <ul><li>Ao lidar com performance, é um jogo de interesses com flexibilidade e manutenção </li></ul><ul><li>Refactoring com foco em performance </li></ul><ul><ul><li>TESTES ! </li></ul></ul>
  8. 8. Dicas em Performance <ul><li>Onde está o problema ? Memória, CPU, disco, I/O, rede Passos </li></ul><ul><ul><li>Diagnóstico </li></ul></ul><ul><ul><li>Priorização </li></ul></ul><ul><ul><li>Análise </li></ul></ul><ul><ul><li>Solução </li></ul></ul><ul><ul><ul><li>Marretada </li></ul></ul></ul><ul><ul><ul><li>Ideal </li></ul></ul></ul><ul><ul><li>Teste </li></ul></ul><ul><ul><li>Documentação </li></ul></ul>
  9. 9. Dicas em Performance <ul><li>Ajustes em código </li></ul><ul><ul><li>Microbenchmarks </li></ul></ul><ul><ul><li>Percepção do usuário final </li></ul></ul><ul><li>Ajustes de arquitetura </li></ul><ul><ul><li>O que é uma transação ? </li></ul></ul><ul><ul><ul><li>Tx JDBC </li></ul></ul></ul><ul><ul><ul><li>Tx Fila </li></ul></ul></ul><ul><ul><ul><li>Tx connector JCA </li></ul></ul></ul>
  10. 10. Dicas em Performance <ul><li>Concorrencia </li></ul><ul><ul><li>Use pool de threads </li></ul></ul><ul><ul><li>Diminuir o tamanho do stack (-Xss) </li></ul></ul><ul><ul><li>Use GC Paralelo </li></ul></ul><ul><ul><ul><li>Múltiplas CPU,multicore, múltiplas threads por core </li></ul></ul></ul><ul><ul><li>Aproveitar as classes Java nativas para sincronização e concorrência </li></ul></ul><ul><ul><ul><li>Pacote java.util.concurrency </li></ul></ul></ul><ul><ul><ul><li>Collections </li></ul></ul></ul><ul><ul><ul><li>Thread safety </li></ul></ul></ul>
  11. 11. Dicas em Performance <ul><li>void runServer() { </li></ul><ul><li>serverSocket = new ServerSocket(4444); </li></ul><ul><li>clientSocket = serverSocket.accept(); </li></ul><ul><li>new Thread(new ClientOperator(clientSocket)).start(); </li></ul><ul><li>} </li></ul><ul><li>class ClientOperator implements Runnable { </li></ul><ul><li>public void run() { </li></ul><ul><li>final int BUFFER = 128; </li></ul><ul><li>InputStream clientIn = clientRunner.getInputStream(); </li></ul>
  12. 12. Dicas em Performance <ul><li>Executor pool = Executors.newFixedThreadPool(10); </li></ul><ul><li>void runServer() { </li></ul><ul><li>serverSocket = new ServerSocket(4444); </li></ul><ul><li>clientSocket = serverSocket.accept(); </li></ul><ul><li>pool.execute(new ClientOperator(clientSocket)); </li></ul><ul><li>} </li></ul><ul><li>class ClientOperator implements Runnable { </li></ul><ul><li>public void run() { </li></ul><ul><li>final int BUFFER = 128; </li></ul><ul><li>InputStream clientIn = clientRunner.getInputStream(); </li></ul>
  13. 13. Dicas em Performance <ul><li>Acesso a Banco de Dados </li></ul><ul><ul><li>Em atividades read-only (relatórios e consultas) </li></ul></ul><ul><ul><ul><li>Usar um pool específico </li></ul></ul></ul><ul><ul><ul><li>Usar isolamento transacional menos restritivo </li></ul></ul></ul><ul><ul><li>Diminuir o isolamento transacional </li></ul></ul><ul><ul><li>Use JDBC puro para performance </li></ul></ul><ul><ul><li>Use PL/SQL para transformações de dados, exigindo alta performance em operações batch </li></ul></ul><ul><ul><li>Use cache e política para limpeza </li></ul></ul><ul><ul><li>Não usar o protocolo XA </li></ul></ul>
  14. 14. Dicas em Performance <ul><li>JVM </li></ul><ul><ul><li>Desabilitar o security manager em ambientes confiáveis </li></ul></ul><ul><ul><li>Desabilitar a verificação de classes </li></ul></ul><ul><ul><ul><li>-Xnoverify </li></ul></ul></ul><ul><ul><li>GC </li></ul></ul><ul><ul><ul><li>JDK > 5: Desabilitar o verbose GC, usar jstat </li></ul></ul></ul><ul><ul><ul><li>Usar algoritmos paralelos em máquinas multiprocessadas e multicore </li></ul></ul></ul><ul><ul><ul><ul><li>-XX:+UseParallelGC </li></ul></ul></ul></ul><ul><ul><ul><ul><li>-XX:+UseParallelOldGC </li></ul></ul></ul></ul>
  15. 15. Dicas em Performance <ul><li>I/O </li></ul><ul><ul><li>Remover System.out </li></ul></ul><ul><ul><li>Diminuir log </li></ul></ul><ul><ul><li>Usar if (log.isDebugEnabled()); para evitar concatenação de strings </li></ul></ul><ul><ul><li>Usar java.io.Externalizable para serialização </li></ul></ul><ul><ul><li>Usar buffers e java.io.BufferedInputStream </li></ul></ul>
  16. 16. Dicas em Performance <ul><li>Servidores de Aplicativos </li></ul><ul><ul><li>Colocar na inicialização, as tarefas de carga, parsing, pré-compilação, etc. </li></ul></ul><ul><ul><ul><li>Problema: deploymen e inicialização demorado </li></ul></ul></ul><ul><ul><ul><li>Benefício: runtime é rápido </li></ul></ul></ul><ul><ul><li>Ajustes </li></ul></ul><ul><ul><ul><li>Acceptor threads, pool, timeout, http queue, NIO, EJB commit-option, http session tuning </li></ul></ul></ul>
  17. 17. Agenda <ul><li>Performance em Aplicações e Ambiente </li></ul><ul><li>Compreensão básica do gerenciamento de memória </li></ul><ul><li>Técnicas e ferramentas para diagnóstico </li></ul><ul><li>Dicas </li></ul>
  18. 18. Heap -Xmx 2g
  19. 19. Heap <ul><li>Larga área de memória que armazena objetos e suas referências </li></ul><ul><li>É dividido em gerações </li></ul><ul><ul><li>Geração Young (ou New ou Eden) </li></ul></ul><ul><ul><li>Geração Old (Tenured) </li></ul></ul><ul><ul><li>Geração Permanente (PermGem) </li></ul></ul><ul><li>O GC ocorre apenas quando a geração não tem espaço para alocação de novos objetos </li></ul><ul><li>Automaticamente remove objetos da memória que não possuem referência </li></ul><ul><li>Possui diferentes algoritmos de GC </li></ul>
  20. 20. Heap -XX:MaxNewSize=256m -Xmx2g
  21. 21. Heap <ul><li>Geração Young </li></ul><ul><ul><li>Onde novos objetos são alocados </li></ul></ul><ul><ul><li>A alocação de memória é de curta duração </li></ul></ul><ul><ul><li>Objetos que não possuem referência são removidos pelo GC </li></ul></ul><ul><ul><li>GC ocorre com mais frequência </li></ul></ul><ul><ul><li>Tamanho pequeno </li></ul></ul>private String name = “Bruce Lee”; public Result consumidor (Long id) { Result r = processar(id); return r; }
  22. 22. Heap -XX:MaxNewSize=256m -Xmx2g
  23. 23. Heap <ul><li>Geração Old </li></ul><ul><ul><li>Onde permanecem objetos cujas referências sobreviveram ao GC da área Young </li></ul></ul><ul><ul><li>Objetos de longa duração </li></ul></ul><ul><ul><li>GC ocorre com menor frequência </li></ul></ul><ul><ul><li>Tamanho superior à área Young </li></ul></ul><ul><ul><li>Exemplos: </li></ul></ul><ul><ul><ul><li>Atributos estáticos, final, Singleton </li></ul></ul></ul>public static String name = “Bruce Lee”; public final Map cache = new HashMap(); private static Loader singleton = new Loader();
  24. 24. Heap -XX:MaxNewSize=256m -Xmx2g -XX:MaxPermSize=128m
  25. 25. Heap <ul><li>Geração Permanente </li></ul><ul><ul><li>Pouca ação de GC </li></ul></ul><ul><ul><li>Armazena a estrutura das classes </li></ul></ul><ul><ul><li>Armazena informações de reflexão </li></ul></ul><ul><ul><li>Objetos de origem nativa (JNI) </li></ul></ul><ul><ul><li>Não participa do heap ( -Xmx ) </li></ul></ul>
  26. 26. Heap <ul><li>Criação de objetos </li></ul>
  27. 27. Heap <ul><li>Ocorre um GC na área Young, quando não tem mais espaço </li></ul>
  28. 28. Heap <ul><li>Ocorre outro GC na área Young </li></ul>
  29. 29. Heap <ul><li>Outro GC ocorre, então objetos que contém referência são transportados para a área Old </li></ul>
  30. 30. Heap <ul><li>Na área de memóra Old ocorrem </li></ul><ul><ul><li>Redimensionamento ( -Xms ≠ -Xmx ) </li></ul></ul><ul><ul><li>Compactação (desfragmentação) </li></ul></ul><ul><ul><li>Larga área de memória para ser monitorada </li></ul></ul><ul><ul><li>GC ocorre de acordo com a política do algorítmo </li></ul></ul>Old
  31. 31. Heap <ul><li>Ergonomia (JDK 5 e 6) </li></ul><ul><ul><li>Dimensionamento automático das gerações </li></ul></ul><ul><ul><li>Baseado nas informações </li></ul></ul><ul><ul><ul><li>Sistema Operacional </li></ul></ul></ul><ul><ul><ul><li>Versão da JVM </li></ul></ul></ul><ul><ul><ul><li>Quantidade de Memória RAM </li></ul></ul></ul><ul><ul><ul><li>Quantidade de processadores </li></ul></ul></ul><ul><ul><ul><li>Tipo do processador (Sparc) </li></ul></ul></ul>
  32. 32. Agenda <ul><li>Performance em Aplicações e Ambiente </li></ul><ul><li>Compreensão básica do gerenciamento de memória </li></ul><ul><li>Técnicas e ferramentas para diagnóstico </li></ul><ul><li>Dicas </li></ul>
  33. 33. Técnicas <ul><li>Resolvendo problemas de memória </li></ul><ul><ul><li>OutOfMemoryError (OOME) </li></ul></ul><ul><ul><li>Outros problemas em geral </li></ul></ul><ul><li>Resolvendo problemas de CPU </li></ul><ul><ul><li>Uso intensivo de CPU e threads </li></ul></ul><ul><ul><li>Garbage Collector com frequência </li></ul></ul><ul><ul><li>Outros problemas em geral </li></ul></ul>
  34. 34. Técnicas Cada técnica para diagnosticar problemas, tem um nível de intrusão no sistema, que pode variar entre um rápido monitoramento no sistema ou um profiler e debug no sistema. Essa é a chave que irá determinar o tempo para resolução do problema
  35. 35. Problemas de memória <ul><li>Como diagnosticar um OOME ? </li></ul><ul><ul><li>Olhe nos logs de aplicações </li></ul></ul><ul><ul><li>Monitore o comportamento </li></ul></ul><ul><ul><ul><li>jmap, jstack, visualgc, jconsole, log do GC </li></ul></ul></ul><ul><ul><li>Verifique qual a causa do OOME </li></ul></ul>
  36. 36. Problemas de memória <ul><li>Tipos de OOME </li></ul><ul><ul><li>Java heap space </li></ul></ul><ul><ul><li>PermGen space </li></ul></ul><ul><ul><li>Out of swap space </li></ul></ul><ul><ul><li>unable to create new native thread </li></ul></ul>Exception in thread &quot;main&quot; java.lang.OutOfMemoryError: Java heap space at ConsumeHeap$BigObject.<init>(ConsumeHeap.java:22) at ConsumeHeap.main(ConsumeHeap.java:41)
  37. 37. Problemas de memória <ul><li>Java heap space </li></ul><ul><li>Causas </li></ul><ul><ul><li>Pouca memória física </li></ul></ul><ul><ul><ul><li>Monitoramento pelo SO: prstat, top, vmstat, mpstat </li></ul></ul></ul><ul><ul><li>Baixo valor do heap </li></ul></ul><ul><ul><ul><li>Tanto Young (-XX:MaxNewSize) e Old (-Xmx) </li></ul></ul></ul><ul><ul><li>Retenção de objetos (memory leak) </li></ul></ul><ul><ul><ul><li>Monitorar com jconsole ou gcviewer , a evolução do GC </li></ul></ul></ul><ul><ul><ul><li>Uso de profiler para monitorar objetos retidos em cada invocação do GC </li></ul></ul></ul>
  38. 38. Problemas de memória <ul><li>Monitoramento pelo sistema operacional </li></ul>top
  39. 39. Problemas de memória <ul><li>Java heap space </li></ul><ul><li>Diagnóstico de memory leak, com monitoramento de GC </li></ul>
  40. 40. Problemas de memória <ul><li>Diagnóstico de memory leak com profiler </li></ul>
  41. 41. Problemas de memória <ul><li>Diagnóstico de memory leak com profiler </li></ul>
  42. 42. Problemas de memória <ul><li>Diagnóstico de memory leak com heap dump </li></ul>
  43. 43. Problemas de memória <ul><li>Java heap space </li></ul><ul><li>Correção </li></ul><ul><ul><li>Aumente o tamanho do heap </li></ul></ul><ul><ul><ul><li>Tanto Young (-XX:MaxNewSize) e Old (-Xmx) </li></ul></ul></ul><ul><ul><li>Memory leak </li></ul></ul><ul><ul><ul><li>Liberar as objetos alocados </li></ul></ul></ul><ul><ul><ul><li>Normalmente são coleções com finalidade de cache </li></ul></ul></ul><ul><ul><li>Aumentar a memória física da máquina </li></ul></ul>
  44. 44. Problemas de memória <ul><li>PermGen space </li></ul><ul><li>Causas </li></ul><ul><ul><li>Pouca memória disponível para a memória permanente </li></ul></ul><ul><ul><li>Classloader leak </li></ul></ul><ul><ul><ul><li>Ocorre quando um classloader será descartado, mas um objeto carregado por este classloader é referenciado por objetos fora deste classloader </li></ul></ul></ul>
  45. 45. Problemas de memória <ul><li>Classloader leak </li></ul>
  46. 46. Problemas de memória <ul><li>Classloader leak </li></ul>
  47. 47. Problemas de memória <ul><li>Classloader leak </li></ul>
  48. 48. Problemas de memória <ul><li>Classloader leak </li></ul>
  49. 49. Problemas de memória <ul><li>Classloader leak </li></ul>
  50. 50. Problemas de memória <ul><li>Classloader leak </li></ul>
  51. 51. Problemas de memória <ul><li>PermGen space </li></ul><ul><li>Correção </li></ul><ul><ul><li>Aumente o tamanho da memória permanente </li></ul></ul><ul><ul><ul><li>Geralmente ocorre quando é usado frameworks de geração de classes </li></ul></ul></ul><ul><ul><ul><li>-XX:MaxPermSize e -XX:PermSize </li></ul></ul></ul><ul><ul><li>Classloader leak </li></ul></ul><ul><ul><ul><li>Gerenciar a dependência dos objetos, para remover a referências dependentes </li></ul></ul></ul>
  52. 52. Problemas de memória <ul><li>Out of swap space </li></ul><ul><li>Causas </li></ul><ul><ul><li>Geralmente ocorre em código nativo (JNI) </li></ul></ul><ul><ul><ul><li>Geralmente invocado por alguma operação Java </li></ul></ul></ul><ul><ul><li>Falta de espaço na memória do SO </li></ul></ul><ul><li>Correção </li></ul><ul><ul><li>Aumentar memória física da máquina </li></ul></ul><ul><ul><li>Diminuir tamanho do heap do java </li></ul></ul>
  53. 53. Problemas de memória <ul><li>Unable to create new native thread </li></ul><ul><li>Causas </li></ul><ul><ul><li>Tamanho elevado do stack ( -Xss ) </li></ul></ul><ul><ul><li>Pouca memória disponível para o SO </li></ul></ul><ul><ul><ul><li>Pois cada thread em Java é mapeada para uma thread do SO ( native threads ) </li></ul></ul></ul><ul><ul><li>Pobre gerenciamento de threads </li></ul></ul>
  54. 54. Problemas de memória <ul><li>Unable to create new native thread </li></ul><ul><li>Correção </li></ul><ul><ul><li>Diminuir o tamanho do Stack ( -Xss ) </li></ul></ul><ul><ul><li>Aumentar memória física </li></ul></ul><ul><ul><li>Diminuir tamanho do heap, pois sobra espaço para o SO </li></ul></ul><ul><ul><li>Melhor gerenciamento de threads </li></ul></ul><ul><ul><ul><li>Usar pool de threads, disponível do Java 5 </li></ul></ul></ul>
  55. 55. Problemas de memória <ul><li>E quando ocorre um crash no servidor ? </li></ul><ul><ul><li>Habilitar o dump de memória (heap dump) </li></ul></ul><ul><ul><ul><li>-XX:+HeapDumpOnOutOfMemoryError </li></ul></ul></ul><ul><ul><ul><li>-XX:+HeapDumpOnCtrlBreak </li></ul></ul></ul><ul><ul><li>Analisar o dump gerado </li></ul></ul><ul><ul><ul><ul><li>O tamanho do dump gerado é proporcional ao tamanho do heap </li></ul></ul></ul></ul><ul><ul><ul><li>Heap roots e heap analyzer </li></ul></ul></ul><ul><ul><ul><li>SAP Memory Analyzer </li></ul></ul></ul><ul><ul><ul><li>jhat </li></ul></ul></ul>
  56. 56. Problemas de memória <ul><li>Outras ferramentas de suporte a monitoramento de memória </li></ul><ul><ul><li>vmstat </li></ul></ul><ul><ul><li>pmap </li></ul></ul><ul><ul><li>ulimit </li></ul></ul>
  57. 57. Problemas de memória <ul><li>Monitoramento pelo sistema operacional </li></ul><ul><li>vmstat </li></ul>
  58. 58. Problemas de memória <ul><li>pmap </li></ul>
  59. 59. Problemas de memória <ul><li>ulimit </li></ul>
  60. 60. Problemas de CPU <ul><li>Como diagnosticar consumo de CPU? </li></ul><ul><ul><li>Monitorar uso do sistema operacional </li></ul></ul><ul><ul><li>Verificar qual aplicação consome os recursos </li></ul></ul><ul><ul><li>Monitorar o GC </li></ul></ul><ul><ul><li>Monitorar as threads </li></ul></ul><ul><ul><li>Uso de profiler </li></ul></ul>
  61. 61. Atividade do SO
  62. 62. Problemas de CPU <ul><li>Monitorar uso do sistema operacional </li></ul><ul><ul><li>Se o problema for da aplicação Java então outro tipo de monitoramento é necessário </li></ul></ul>Verificar atividade de GC
  63. 63. Atividade do GC
  64. 65. Atividade do GC <ul><li>Correção </li></ul><ul><ul><li>Dimensionar as áreas de memória adequadamente </li></ul></ul><ul><ul><ul><li>Mesmo que não ocorra OOME, a frequencia do GC consome CPU exageradamente </li></ul></ul></ul><ul><ul><li>Parametrizar o comportamento da JVM </li></ul></ul><ul><ul><ul><li>Algoritmos de GC </li></ul></ul></ul>
  65. 66. Problemas de CPU Verificar atividade de Threads
  66. 67. Comportamento das threads <ul><li>Causas </li></ul><ul><ul><li>Pobre gerenciamento de threads </li></ul></ul><ul><ul><ul><li>Quantidade exagerada de threads </li></ul></ul></ul><ul><ul><ul><li>Não usar pool de threads </li></ul></ul></ul><ul><ul><li>Máquina insuficiente para processamento </li></ul></ul><ul><ul><li>Dead lock </li></ul></ul><ul><ul><ul><li>Dependência circular </li></ul></ul></ul><ul><ul><li>Pobre implementação da aplicação </li></ul></ul><ul><ul><ul><li>Processamento intenso de strings </li></ul></ul></ul><ul><ul><ul><li>Transformação de dados desnecessária </li></ul></ul></ul>
  67. 68. Comportamento das threads <ul><li>jstack </li></ul>
  68. 69. Comportamento das threads
  69. 70. Comportamento das threads
  70. 71. Comportamento das threads <ul><li>Uso do profiler implica </li></ul><ul><ul><li>Aplicação compilada em modo debug </li></ul></ul><ul><ul><li>Modificar as configurações da JVM para profiler </li></ul></ul><ul><ul><ul><li>Penaliza performance </li></ul></ul></ul><ul><ul><ul><li>Modifica o comportamento da JVM (modo interpretado) </li></ul></ul></ul><ul><ul><li>Console gráfico para análise on-line </li></ul></ul>
  71. 72. Ferramentas adicionais para diagnóstico
  72. 73. Ferramentas para diagnóstico <ul><li>Outras ferramentas para diagnóstico </li></ul><ul><ul><li>mpstat, prstat, top, vmstat, pmap </li></ul></ul><ul><ul><ul><li>Estatísticas de CPU e memória </li></ul></ul></ul><ul><ul><li>iostat </li></ul></ul><ul><ul><ul><li>Tráfego de I/O (rede e disco) </li></ul></ul></ul><ul><ul><li>pstack </li></ul></ul><ul><ul><ul><li>Stacktrace de processos </li></ul></ul></ul><ul><ul><li>strace, truss </li></ul></ul><ul><ul><ul><li>Rastreio de system calls </li></ul></ul></ul><ul><ul><li>ps, pstree, ptree </li></ul></ul><ul><ul><ul><li>Árvore de processos </li></ul></ul></ul>
  73. 74. Ferramentas para diagnóstico <ul><li>Outras ferramentas para diagnóstico </li></ul><ul><ul><li>ldd </li></ul></ul><ul><ul><ul><li>Árvore de dependências de bibliotecas </li></ul></ul></ul><ul><ul><li>dmesg </li></ul></ul><ul><ul><ul><li>Inicialização do kernel </li></ul></ul></ul><ul><ul><li>ulimit </li></ul></ul><ul><ul><ul><li>Limites de recursos do usuário </li></ul></ul></ul>
  74. 75. Ferramentas para diagnóstico <ul><li>Rede (unixes) </li></ul><ul><ul><li>Wireshark (Ethereal), tcpdump, snoop </li></ul></ul><ul><ul><ul><li>Análise de tráfego de rede </li></ul></ul></ul><ul><ul><li>dig, nslookup </li></ul></ul><ul><ul><ul><li>Resolução de nomes DNS </li></ul></ul></ul><ul><ul><li>netstat </li></ul></ul><ul><ul><ul><li>Status de conexões, tabelas de roteamento, etc </li></ul></ul></ul><ul><ul><li>lsof </li></ul></ul><ul><ul><ul><li>Estatísticas de uso de file descriptors </li></ul></ul></ul>
  75. 76. Ferramentas para diagnóstico
  76. 77. Ferramentas para diagnóstico
  77. 78. Agenda <ul><li>Performance em Aplicações e Ambiente </li></ul><ul><li>Compreensão básica do gerenciamento de memória </li></ul><ul><li>Técnicas e ferramentas para diagnóstico </li></ul><ul><li>Dicas </li></ul>
  78. 79. <ul><li>Servidor de Aplicativos </li></ul><ul><ul><li>Monitoramento de recursos </li></ul></ul><ul><ul><ul><li>Pool de conexões, threads </li></ul></ul></ul><ul><ul><li>Logs </li></ul></ul><ul><ul><ul><li>Níveis de log </li></ul></ul></ul><ul><ul><li>Keep-alive e pipeline </li></ul></ul><ul><ul><li>Classpath </li></ul></ul><ul><ul><li>Cluster </li></ul></ul><ul><ul><ul><li>Sincronização, I/O, rede </li></ul></ul></ul><ul><ul><li>Threads </li></ul></ul><ul><ul><ul><li>Acceptor, queue, pool, timeout </li></ul></ul></ul>Dicas
  79. 80. <ul><li>Servidor de Aplicativos </li></ul><ul><ul><li>Classloader </li></ul></ul><ul><ul><li>Carga dinâmica de aplicações </li></ul></ul><ul><ul><ul><li>Compilação de JSP, redeploy, autodeploy, auto discovery </li></ul></ul></ul><ul><ul><li>Gerenciamento de sessão </li></ul></ul><ul><ul><ul><li>HttpSession </li></ul></ul></ul><ul><ul><ul><li>Stateful Session Bean </li></ul></ul></ul>Dicas
  80. 81. Dicas <ul><li>Seja cauteloso com informações obtidas </li></ul><ul><li>Não seja prematuro ao informar sobre onde está o problema </li></ul><ul><li>Ter uma visão do contexto computacional </li></ul><ul><ul><li>Configuração de máquinas, sistema operacional, estrutura de rede, serviços, e dependências </li></ul></ul><ul><li>Compreender quais os serviços afetados e nível de importância </li></ul><ul><li>Conhecer as equipes envolvidas e seus responsáveis </li></ul>
  81. 82. Dicas <ul><li>Não entre em pânico </li></ul><ul><li>Conheça as ferramentas e como usá-las </li></ul><ul><li>Não dependa de consoles gráficos </li></ul><ul><li>Isole o problema </li></ul><ul><li>Tente confirmar todos os relatos </li></ul><ul><li>Ter acesso ao código fonte da aplicação </li></ul><ul><li>Ter a mão um bom decompilador (jad) </li></ul><ul><li>Verificar todos os arquivos de configurações </li></ul><ul><li>Ao confirmar o problema, já entregue a solução </li></ul>
  82. 83. Muito Obrigado Claudio Miranda [email_address] http://www.soujava.org.br http://www.summa-tech.com http://www.claudius.com.br

×