Entendendo a Máquina Virtual Java e o bytecode

Azafo Cossa
3 min readApr 11, 2021
Photo by Pixabay from Pexels

O que permite o Java resolver os problemas de segurança e portabilidade é que o código java compilado não é exatamente um código executável. Em vez disso, ao compilar um programa escrito em java, gera um bytecode.

Bytecode é um conjunto de instruções altamente otimizados, projetado para ser executado pelo sistema de tempo de execução java (JRE), que é chamado de Máquina Virtual Java (JVM). Na sua essência, o JVM original foi desenhado para ser um interpretador do bytecode. Isso pode ser um pouco surpreendente, pois muitas linguagens modernas são projetadas para serem compiladas em código executável devido a questões de desempenho. No entanto, o fato de um programa Java ser executado pela JVM ajuda a resolver os principais problemas associados aos programas que correm na web. Segue-se o porquê.

Traduzir um programa Java em bytecode torna muito mais fácil executar um programa em uma ampla variedade de ambientes porque apenas a JVM precisa ser instalado em cada plataforma. Uma vez instalado JVM, qualquer programa escrito em Java pode correr nela. Apesar de que a JVM será diferente dependendo da plataforma, todas máquinas virtuais entendem o mesmo bytecode gerado pelo compilador Java. Se um programa Java fosse compilado para código nativo, versões diferentes do mesmo programa teriam que existir para cada tipo de CPU conectado à Internet. Obviamente, essa não é uma solução viável. Portanto, a execução de bytecode pela JVM é a maneira mais fácil de criar programas verdadeiramente portáveis.

O fato de um programa Java ser executado pela JVM também ajuda a torná-lo seguro porque a JVM está no controle, ela pode conter o programa e evitar que ele gere efeitos colaterais no sistema operativo.

Em geral, quando um programa é compilado para forma intermediária e então interpretado por uma máquina virtual, ele é executado mais lento do que seria se fosse compilado para um código executável. Porém, com o Java, a diferença entre os dois não é tão grande. Como o bytecode foi altamente otimizado, o uso de bytecode permite que a JVM execute programas muito mais rápido do que você poderia esperar.

Embora o Java tenha sido projetado como uma linguagem interpretada, não há nada no Java que impeça a compilação rápida de bytecode em código nativo para aumentar o desempenho. Por esse motivo, a tecnologia HotSpot foi introduzida não muito tempo depois do lançamento inicial do Java. O HotSpot fornece um compilador Just-In-Time (JIT) para bytecode. Quando um compilador JIT faz parte da JVM, partes selecionadas do bytecode são compiladas em código executável em tempo real, peça por peça, com base na demanda. É importante entender que não é prático compilar um programa Java inteiro em código executável de uma só vez, porque Java executa várias verificações no tempo de execução que só podem ser feitas em tempo de execução. Em vez disso, um compilador JIT compila o código conforme necessário, durante a execução. Além disso, nem todas as sequências de bytecode são compiladas — apenas aquelas que se beneficiarão da compilação. O código remanescente é apenas interpretado. No entanto, a abordagem just-in-time ainda produz um aumento significativo no desempenho. Mesmo quando a compilação dinâmica é aplicada ao bytecode, os recursos de portabilidade e segurança ainda se aplicam, porque a JVM ainda é responsável pelo ambiente de execução.

É tudo no artigo de hoje, se gostou deixa o seu aplauso 👏, siga para ser notificado quando eu postar mais um artigo, até mais!

--

--

Azafo Cossa

Sou desenvolvedor de software, atualmente trabalho como analista de sistema e escrevo programas para a web. Escrevo no medium e gravo vídeos para Youtube.