Introdução a JVM – Java Virtual Machine

Introdução

Tão importante quanto aprender a programar em uma nova linguagem ou plataforma, é conhecer e entender um pouco os principais benefícios que ela nos oferece e claro, saber quando e como podemos tirar vantagem do que temos em mãos. No Java, com certeza, a JVM é peça chave e fundamental para a popularidade da linguagem e da plataforma, e é nela onde encontramos todo o poder para termos aplicações performáticas e escaláveis.

Iniciando na Java Virtual Machine.

JVM é uma máquina virtual, como seu próprio nome já diz. E uma das funcionalidades dela é de servir como interpretador para o Java.
Resumindo, o funcionamento é bem simples. Você escreve o código em um arquivo .java, compila, e é gerado um arquivo .class, esse arquivo .class é conhecido como  bytecode. A JVM irá ler/interpretar esse bytecode e executá-lo.

byteCodeJVMLinuxWindows

Dessa forma, um código feito no Linux e compilado no Linux, pode ser executado no Windows, MacOSX ou no seu celular, por exemplo. Essa portabilidade foi o que fez o Java ser tão difundido, tanto que o principal slogan de “venda” da plataforma é: Escreva uma vez, rode em qualquer lugar!

Cada sistema operacional tem a sua JVM rodando e interpretando para a instrução de máquina em que ele se encontra. Mas, será que um interpretador é mais lento do que um código nativo executável?

Porque o Java era considerado lento?

Bem nas primeiras versões do Java, a máquina virtual era apenas um interpretador de bytecode, apenas isso. Ela lia os .class, traduzia cada bytecode para a sua máquina(SO) específica e só, que para época já era um grande avanço.

Então saiu o Java 1.1 e nele foi incluído pela primeira vez, um mecanismo, chamado de JIT Compiler, que foi adquirido da Symantec.

Mais tarde, na versão 1.2 um outro mecanismo foi adicionado, o HotSpot. A partir dai, com a junção dessas duas novas tecnologias adicionadas a JVM e as suas evoluções posteriores até seus dias de hoje, é que faz a JVM ser equiparável e as vezes até mais rápida do que programas escritos nativos em C e C++.

Qual a diferença do binário nativo e bytecode?

Quando compilamos um programa em C, temos uma etapa de compilação estática, assim como no Java também tem. Quando esses arquivos binários são compilados, são feitas algumas otimizações. No C por exemplo, esse binário antes de ser gerado, na compilação receberá algumas otimizações, então só depois disso será gerado um binário executável. No Java ele passa por esse mesmo processo, na compilação, receberá otimizações, mas, ao contrário do C que gera um binário executável na máquina, o Java irá gerar um bytecode, que ainda será interpretado/executado pela VM, e neste momento a VM poderá e irá fazer novas otimizações, otimizando e melhorando ainda mais o programa.

Mas, e se quisermos aumentar a performance desse programa em C?

Teríamos que esperar uma nova versão desse código (compilado para a máquina executada), assim como teríamos que ter a portabilidade para cada SO, processadores Intel ou AMD etc. Ou seja, teríamos que compilar esse código para cada SO que queremos rodar nosso programa, no caso. E ainda mais, o fabricante terá ou não que garantir que essa nova versão compilada do programa, rode em sistemas operacionais “antigos” ou exigir uma portabilidade mínima, como rodar apenas do SO 1.0 superior, algo do tipo.

Como no Java nosso código “se tornou” bytecode, que será interpretado por uma VM, então podemos ter outras otimizações específicas ou não para cada tipo de SO e máquina, isso sem a necessidade de recompilar ou aguardar uma nova versão do programa e sem precisar mexer no código. Isso porque a JVM é quem está executando e interpretando o nosso programa. Como a JVM está sempre sofrendo constantes atualizações e melhorias, basta atualizar a JVM que você terá esses ganhos, sem alterar seu código.

Isso é possível pelo simples fato do Java não fazer a compilação para código nativo , logo ele consegue usar estratégias focadas no SO e no hardware em tempo de execução. E teremos ainda a retrocompatibilidade, que faz ser possível executar um programa em Java feito na versão 1.2 em uma VM da versão 7.0 por exemplo.

Durante essa execução a JVM irá analisar e detectar os pontos mais importantes e mais executados da sua aplicação, que ela chama de “pontos quentes” e então esses métodos ou trechos de códigos são compilados em tempo de execução para instruções nativas e otimizadas. Deixando nosso programa mais rápido, sem nem ao menos precisarmos mexer no código.

“O ganhos reais de performance do Java, devemos à otimização adaptativa, ou seja, é simplesmente a capacidade de se adaptar e fazer otimizações dependendo do uso e das condições do momento (memória, processador etc).”

Quem detecta e analisa esses pontos mais “quentes”, ou seja, esses pontos mais importantes e executados da sua aplicação é o mecanismo chamado de HotSpot, e logo depois ele aciona o outro mecanismo, que é o JIT Compiler.

Não iremos neste post entrar em detalhes sobre eles, o que você precisa entender por enquanto é que:

“O JIT Compiler irá compilar para instrução nativa e otimizada o trecho “quente” e em  VMs mais modernas esse trecho pode até ser recompilado em otimizações mais agressivas, melhorando consideravelmente a performance, claro isso vai variar do fabricante da VM.”

Concluindo

Essa foi uma explicação bem superficial sobre como a JVM funciona e seu objetivo. Lembramos também que a JVM é uma especificação, que possui vários fabricantes, onde temos os mais populares que são da SUN/Oracle e Open JDK.

Podemos observar que ela também pode oferecer muito mais, e com o conhecimento certo e configuração correta, podemos explorar ao máximo toda a potência da VM do Java.

Temas como este fazem parte do cotidiano dos nossos instrutores e claro que não poderiam ficar de fora do curso de  Java e Orientação a Objetos da TriadWorks.

No nosso próximo post, iremos falar mais sobre  essas tecnologias/estratégias adotadas pela JVM que comentamos neste post: JIT Compiler e HotSpot e tentar entender melhor como elas funcionam.

Be Sociable, Share!
Publicado em JAVA, TriadWorks Marcado com: , , , , , , , , , , , , , , , , ,
Um comentário sobre “Introdução a JVM – Java Virtual Machine
  1. NÃO RESPONDEU MINHA PERGUNTA

2 Pings/Trackbacks para "Introdução a JVM – Java Virtual Machine"
  1. […] para desligar os logs em produção, a mais simples, com o Log4j, é passar um argumento para JVM no startup da sua aplicação ou servidor, apontando para outro arquivo de configuração do Log4j […]

  2. […] no post anterior como a JVM funciona e como ela detecta e analisa os pontos “quentes” da aplicação. Vimos que […]

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

*