Performance em Java
Upcoming SlideShare
Loading in...5
×
 

Performance em Java

on

  • 13,631 views

Palestra efetuada por Claudio Miranda no evento Conexão Java 2007

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

Statistics

Views

Total Views
13,631
Views on SlideShare
13,605
Embed Views
26

Actions

Likes
10
Downloads
332
Comments
0

1 Embed 26

http://www.slideshare.net 26

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Performance em Java Performance em Java Presentation Transcript

  • Performance em Aplicações Java Claudio Miranda Summa Technologies Conexão Java 2007
  • 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
  • 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
  • Agenda
    • Performance em Aplicações e Ambiente
    • Compreensão básica do gerenciamento de memória
    • Técnicas e ferramentas para diagnóstico
    • Dicas
  • Agenda
    • Performance em Aplicações e Ambiente
    • Compreensão básica do gerenciamento de memória
    • Técnicas e ferramentas para diagnóstico
    • Dicas
  • 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
  • Dicas em Performance
    • Ao lidar com performance, é um jogo de interesses com flexibilidade e manutenção
    • Refactoring com foco em performance
      • TESTES !
  • 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
  • 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
  • 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
  • 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();
  • 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();
  • 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
  • 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
  • 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
  • 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
  • Agenda
    • Performance em Aplicações e Ambiente
    • Compreensão básica do gerenciamento de memória
    • Técnicas e ferramentas para diagnóstico
    • Dicas
  • Heap -Xmx 2g
  • 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
  • Heap -XX:MaxNewSize=256m -Xmx2g
  • 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; }
  • Heap -XX:MaxNewSize=256m -Xmx2g
  • 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();
  • Heap -XX:MaxNewSize=256m -Xmx2g -XX:MaxPermSize=128m
  • 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 )
  • Heap
    • Criação de objetos
  • Heap
    • Ocorre um GC na área Young, quando não tem mais espaço
  • Heap
    • Ocorre outro GC na área Young
  • Heap
    • Outro GC ocorre, então objetos que contém referência são transportados para a área Old
  • 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
  • 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)
  • Agenda
    • Performance em Aplicações e Ambiente
    • Compreensão básica do gerenciamento de memória
    • Técnicas e ferramentas para diagnóstico
    • Dicas
  • 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
  • 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
  • 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
  • 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)
  • 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
  • Problemas de memória
    • Monitoramento pelo sistema operacional
    top
  • Problemas de memória
    • Java heap space
    • Diagnóstico de memory leak, com monitoramento de GC
  • Problemas de memória
    • Diagnóstico de memory leak com profiler
  • Problemas de memória
    • Diagnóstico de memory leak com profiler
  • Problemas de memória
    • Diagnóstico de memory leak com heap dump
  • 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
  • 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
  • Problemas de memória
    • Classloader leak
  • Problemas de memória
    • Classloader leak
  • Problemas de memória
    • Classloader leak
  • Problemas de memória
    • Classloader leak
  • Problemas de memória
    • Classloader leak
  • Problemas de memória
    • Classloader leak
  • 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
  • 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
  • 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
  • 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
  • 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
  • Problemas de memória
    • Outras ferramentas de suporte a monitoramento de memória
      • vmstat
      • pmap
      • ulimit
  • Problemas de memória
    • Monitoramento pelo sistema operacional
    • vmstat
  • Problemas de memória
    • pmap
  • Problemas de memória
    • ulimit
  • 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
  • Atividade do SO
  • 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
  • Atividade do GC
  •  
  • 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
  • Problemas de CPU Verificar atividade de Threads
  • 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
  • Comportamento das threads
    • jstack
  • Comportamento das threads
  • Comportamento das threads
  • 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
  • Ferramentas adicionais para diagnóstico
  • 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
  • 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
  • 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
  • Ferramentas para diagnóstico
  • Ferramentas para diagnóstico
  • 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
  • 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
  • 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
  • Muito Obrigado Claudio Miranda [email_address] http://www.soujava.org.br http://www.summa-tech.com http://www.claudius.com.br