Segunda-feira, 8 de Setembro de 2008

Aniversário do CEJUG. 6 anos de muito JAVA!



Este ano o CEJUG completa 6 anos e para comemorar trouxe a Fortaleza, com o apoio da Sun Microsystems e do SouJava, Kohsuke Kawaguchi e Maurício Leal. Para completar essa grande festa, o CEJUG trouxe Bruno Pereira, da Concrete Solutions e Globo.com!
Venha participar dessa grande festa, rever os amigos, conhecer os evangelistas da Sun, curtir um som com a banda Alarme Falso e concorrer a diversos brindes (entre eles um voucher)!

Quarta-feira, 20 de Agosto de 2008

Configurando um host virtual no Tomcat

Há um bom tem precisei criar um host virtual no Tomcat. "Host Virtual?" Pelo nome achei que fosse algo mais difícil... Se você não sabe ou está com dúvida sobre como fazer, acesse o meu blog no CEJUG. Lá fiz um tutorial bem didático sobre como fazer esta configuração e também como testar imediatamente se ela ficou correta. Confira.

Segunda-feira, 28 de Abril de 2008

Começando a resolver o travamento

Minha aplicação está com problema de performance. O que devo fazer?
Esta é uma pergunta feita por muitas pessoas quando suas aplicacões apresentam problema de lentidão e travamento. Porém, as causas para isso podem ser diversas, e algumas vezes podem nem estar diretamente ligadas a aplicação propriamente dita. Então é muito difícil dizer o que deve ser feito para solucionar problemas deste tipo, sem antes fazer uma análise geral do contexto no qual a aplicação está inserida para que se possa indentificar os possíveis responsáveis pela sua lentidão e ou travamento.

A análise de contexto verifica pontos que se relacionam direta (quantidade de dados, uso inadequado de frameworks, etc.) e indiretamente (problemas na rede, virus, etc) com o funcionamento do software. Esta análise elimina muitos possíveis responsáveis, permitindo-nos focar naqueles que possuem maiores probabilidade de serem os causadores da lentidão ou travamento. Ou seja, uma vez feita esta análise, é possível listar com maior precisão o(s) possível(eis) responsável(eis) pela lentidão, para, somente então, planejarmos as ações corretivas para o problema.

O planejamento é fundamental para dar objetividade e acompanhamento, além, é óbvio, de organizar todo o trabalho. Como resultado desse planejamento criei um documento que me balizou pelo que seria feito. Seu formato é mais ou menos o seguinte:

Objetivo: descreve o que se espera analisando este candidato e para que o resultado esperado é importante.
Pontos a serem verificados: Lista dos pontos mais fortemente ligados ao problema.
Possíveis ações corretivas: Lista de ações que provavelmente ajudarão na solução do problema relativo a este candidato.
Ações realizadas: Lista das ações que já foram realizadas.

Ficou assim:

Jvm

Objetivo: Entender o funcionamento interno do java, acessar/manipular parâmetros que otimizem o desempenho das aplicações e quais JVM's podem ser utilizadas, de forma o pesquisador seja capaz de determinar qual jvm deve ser utilizada e como deve ser configurada, bem como apresentar técnicas de escrita de códigos performáticos.

Pontos a serem verificados:
  • Funcionamento da JVM;
  • Parâmetros de configuração;
  • JVM disponíveis (IBM/BEA/JROCKIT/etc);
  • Qual o desempenho (consumo de memória/tempo) do Sistema (processando pontos críticos como alteração em cascata) nas seguintes jvms: (Utilizar ferramentas que auxiliem nas estatísticas. Criar pelo menos uma classe que monitore memória e tempo durante os testes.)
    • HotSpot Client 4;
    • HotSpot Server 4;
    • HotSpot Client 5;
    • HotSpot Server 5;
    • Demais jmvs analisadas
Possíveis ações corretivas: (Antes de decidir trocar a jvm, deve-se ter vericado que o servidor web está utilizando o HotSpot Server)
  • Passar parâmetros de configuração da memória
  • Atualizar a JVM?
  • Utilizar outra JVM? (IBM/BEA/JROCKIT/?)
  • Compilar o Sistema no java 5?
  • ...
Ações implementadas:
  • Passar parâmetros de configuração da memória
  • Compilar o Sistema no java 5?

PostgreSQL
Objetivo: Identificar configurações que otimizem o funcionamento do banco de dados.

Pontos a serem verificados:
  • Configurações avançadas
Possíveis ações corretivas
...

Ações implementadas
  • Diminuição da quantidade de conexões (por default são 100 conexões. Passou a utilizar somente as requeridas pela aplicação);
  • Configuração das propriedades “shared_buffers” e “work_mem”;
  • Ativação do AutoVacuum

Com o planejamento pronto, podemos então iniciar o processo de pesquisa e testes.

No próximo post sobre este assunto apresentarei os alguns parâmetros de gerenciamento da memória no Java e demonstrarei alguns exemplos de uso desses parâmetros no TomCat. Até lá.

Segunda-feira, 21 de Janeiro de 2008

Gerenciamento de Memória do Java (Testemunho e Referências)

Por motivos diversos andei meio afastado dos posts mas agora estou tentado voltar.

Bem, dando continuidade no assunto de performance do java, quero compartilhar uma experiência muito valiosa que tive há algum tempo atrás. Tudo começou há muito tempo... quando escrevi um método que fazia uma consulta ao banco de dados. Acontece que se os parâmetros chegassem nulos, o que era uma possibilidade de filtro, o resultado ficava muito grande e construia muitos muitos objetos na memória, resultando no terrível OutOfMemoryError.

"OutOfMemory???" Adivinha o que pensei... Exatamente: "Ora, é claro que é problema do Java. Todo mundo sabe que o java consome muita memória. Certamente está faltando alguma configuração aí para que ele funcione corretamente..." (Que vergonha... como eu era ignorante! Acho que vou apagar este trecho...). Caindo no problema que comentei no post anterior, que é codificar algo defeituoso e deixar que o Garbage Collector se vire para arrumar a bagunça que eu fiz. Mas isso teve um lado possitivo muito grande para mim: o conhecimento e experiência adquiridos enquanto buscava uma solução para este "problema".

Então estudei bastante o funcionamento da máquina virtual Java, como ocorria o gerenciamento de memória nela, quais algoritmos de coleta de lixo ela tinha a minha disposição, como selecionar o algoritmo mais apropriado para o meu cenário, quais ferramentas eu poderia utilizar para me auxiliarem no diagnóstico de consumo de hardware do servidor, dentre várias outras questões envolvidas no assunto. Certamente encontrei muito material sobre isto e fiz uma seleção dos melhores para que sirvam de base para outros pesquisadores. São eles:

Se não tiverem tempo de ler tudo, leiam pelo menos
o material do Helder da Rocha. É excelente.

Nos próximos dias devo comentar mais sobre esta experiência. Até mais!

Quinta-feira, 17 de Janeiro de 2008

5 principais motivos pelos quais o Java é lento

Alguns amigos que não trabalham com Java, me perguntaram: “Por quê o java é lento?”. Respondendo à pergunta deles, escrevi este post.

Então fiz um levantamento dos 5 principais motivos pelos quais o Java é lento. São eles:
  1. O programador mexe naquilo que não conhece. Querendo utilizar uma ferramenta ou um framework sem o devido conhecimento necessário para isso, o coitado do programador faz uso ineficiente dos mesmos. Um exemplo disso, é utilizar o hibernate com Eager, e o gerenciador de conexões do próprio hibernate. Este cenário com uma modelagem correta, já gera um problema enorme de performance. Imagine se o sistema não estiver nem bem modelado nem bem implementado. Qualquer consultinha aí, resulta em milhares de joins, milhões de campos, consumo pesado do processador para executar as consultas, resultando em trilhões de objetos, ou seja, uso excessivo de memória. É só uma pequena questão de tempo até que o sistema fique lento e até trave. Ah... mas o programador ainda não ficou satisfeito com um só framework. Muito esperto, ele quer fazer cache dos objetos. Porém, não planejou corretamente que seria “cacheado”... De presente, ganhou outro tiro no pé.
  2. Deixar tudo por conta do Garbage Collector. O programador vem com aquele pensamento: “ah... o Java tem coletor de lixo. Não preciso me preocupar com a modelagem(heranças, relacionamentos e implementação) da minha aplicação.”. E então escreve o maior POG de sua vida. Depois que o sistema fica lento ou mesmo trava tem o descaramento de dizer: “O Java é lento mesmo.”. Pode um negócio desses?
  3. Falha na especificação do hardware do servidor. Simplesmente desenvolver o software, não é uma solução completa para o cliente. É necessário também informar as mínimas configurações de hardware nas quais o software terá um funcionamento perfeito. Baseado no “tamanho do processamento”, na quantidade de acessos simultâneos, duração de cada acesso e outras variáveis, o engenheiro de software deve saber especificar o hardware que conseguirá atender a toda a demanda do sistema. Se estas variáveis não forem devidamente avaliadas, o servidor simplesmente não vai conseguir manter a aplicação funcionando. E este é um problema que não ocorre somente com o Java, mas com todas as linguagens.
  4. Servidor “Bombril”. É o servidor com mil e uma utilidades. Uma única máquina disponibilizando vários serviços. Se não houver processamento e memória para a demanda de todas as aplicações, pode ter certeza que vai ficar lento. Mais ainda: pode é travar algumas aplicações.
  5. Falta de informação. Este é o principal motivo. Eu o coloquei por último para o leitor não se sentir ofendido e desistir no começo da leitura ;). Mas continue lendo! Se chegou até aqui, continue! Mas dizer que uma aplicação implementada corretamente e rodando sobre o hardware adequado, vai ser lenta por ter sido feita em Java; ou deixar de fazer o programa em Java por achar que ele vai ficar lento, é porque não sabe como o Java funciona.
Então, alguém (que acha que sabe muito) poderia dizer: “O Java é lento porque é interpretado!”. Então eu responderia: “Muita calma nesta hora. 1º. O Java não é 100% interpretado, e; 2º. sendo interpretado, ele ganha muitas vantagens.”. A máquina virtual identifica, em runtime, através de agentes e profilers, as partes do código que são mais utilizadas e as compila. (Veja bem: código compilado! Vai querer insistir que é lento?). Mas, não satisfeita, a JVM ainda faz mais: utilizando-se destes indicadores, ela própria “remodela” a implementação do programador retirando dela trechos inacessíveis (um if cuja condição nunca é satisfeita, ou um laço que nunca é percorrido...) objetos que foram instanciados mas nunca são usados e, para completar, muda, em tempo de execução e quantas vezes achar necessário, a estrutura resultante do byte-code, desenrolando loops e aplicando outras técnicas de otimização de código.

Posso falar também do garbage collector, que desempenha um papel importantíssimo dentro do Java. Ele possui vários algorítmos de coleta de lixo, e uma configuração específica para cada classe de hardware. Sua configuração padrão resolve a maioria dos casos. Porém, ela pode ser redefinida para que se adeque melhor à necessidade da aplicação.

O Java vem tendo evoluções descomunais em termos de performance e auto-ajuste no uso de recursos de hardware (memória e cpu) com o Tiger e com o Mustang. O fato do Java ser uma linguagem interpretada, só tem vantagens. Recursos como o Ergnomics (que se reconfigura automaticamente para otimizar o uso de memória, baseado em apenas 2 metas de performance), a evolução contínua dos algorítmos de coleta de lixo, de otimização de código, do Garbage Collector, do compilador JIT e das várias outras tecnologias desenvolvidas pela SUN, têm tornado o Java uma linguagem cada vez mais rápida e robusta. O mito de que o Java é lento, já morreu há anos! Atualize-se. Use Java!

Quarta-feira, 16 de Janeiro de 2008

Regras na prática com Drools (Comentário de Artigo)

Lendo a Java Magazine nº 53, vi o artigo “Drools: Regras na prática”, do Edgar A. Silva, então queria comentá-lo aqui.

Programação baseada em regras é um assunto muito interessante. E pra quem já o conhecia, o artigo fornece um “hello-word” bastante objetivo com o Drools. Uma leitura que acho muito boa e que indico é a do artigo “Programação com Regras”, de Osvaldo Pinali Doederlein, na JM 15, pois trata mais dos conceitos e de quando aplicar a programação baseada em regras.

Outra coisa que achei interessante foi o plugin do Eclipse para edição de DSLs. Gostei.

Nota 7 para o artigo.

Segunda-feira, 14 de Janeiro de 2008

Bibliotecas JS

UI

Desenhar com JS/ Mover coisas/

Editores