Performance em Java

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

1 comments

Comments 1 - 1 of 1 previous next Post a comment

Post a comment
Embed Video
Edit your comment Cancel

4 Favorites

Performance em Java - Presentation Transcript

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

+ Claudio MirandaClaudio Miranda, 3 years ago

custom

5204 views, 4 favs, 0 embeds more stats

Palestra efetuada por Claudio Miranda no evento Con more

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 5204
    • 5204 on SlideShare
    • 0 from embeds
  • Comments 1
  • Favorites 4
  • Downloads 158
Most viewed embeds

more

All embeds

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories