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:
- 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é.
- 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?
- 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.
- 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.
- 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!