Visão Geral do Compilador JIT

O compilador Just-In-Time (JIT) é um componente do Java™ Runtime Environment que melhora o desempenho de aplicativos Java no tempo de execução.

Os programas Java consistem em classes, que contêm bytecodes neutros quanto a plataforma que podem ser interpretados por uma JVM em muitas diferentes arquiteturas de computador. No tempo de execução, a JVM carrega os arquivos de classe, determina a semântica de cada bytecode individual e executa a computação apropriada. O uso adicional do processador e da memória durante a interpretação significa que um aplicativo Java executa mais lentamente do que um aplicativo nativo. O compilador JIT ajuda a melhorar o desempenho de programas Java, compilando bytecodes no código de máquina nativo no tempo de execução.

O compilador JIT está ativado por padrão e é ativado quando um método Java é chamado. O compilador JIT compila os bytecodes desse método no código de máquina nativo, compilando-o "just in time" para execução. Quando um método tiver sido compilado, a JVM chama o código compilado desse método diretamente, em vez de interpretá-lo. Teoricamente, se a compilação não tiver requerido tempo de processador e uso de memória, compilar cada método pode permitir que a velocidade do programa Java se aproxime àquela de um aplicativo nativo.

A compilação JIT não requer tempo de processador e uso de memória. Quando a JVM é inicializada primeiramente, milhares de métodos são chamados. Compilar todos esses métodos pode afetar de forma significativa o tempo de inicialização, mesmo se o programa atingir eventualmente um desempenho de pico muito bom.

Na prática, os métodos não são compilados na primeira vez que são chamados. Para cada métodos, a JVM mantém uma contagem de chamadas, que é incrementada toda vez que o método é chamado. A JVM interpreta um método até sua contagem de chamadas exceder um limite de compilação JIT. Portanto, métodos frequentemente usados são compilados logo após a JVM ser iniciada e métodos menos usados são compilados muito mais tarde ou não são usados de forma alguma. O limite de compilação JIT ajuda a JVM a ser iniciada rapidamente e ainda assim ter desempenho melhorado. O limite foi cuidadosamente selecionado para obter um equilíbrio ideal entre os tempos de inicialização e o desempenho de longo prazo.

Após um método ser compilado, sua contagem de chamada é reconfigurada para zero e chamadas subsequentes ao método continuam a incrementas sua contagem. Quando a contagem de chamadas de um método atinge o limite de recompilação JIT, o compilador JIT compila o mesmo uma segunda vez, aplicando uma seleção de otimizações maior do que na compilação anterior. Esse processo é repetido até o nível de otimização máximo ser atingido. Os métodos mais ocupados de um programa Java sempre são otimizados de forma mais agressiva, maximizando os benefícios de desempenho de usar o compilador JIT. O compilador JIT também pode medir os dados operacionais no tempo de execução e usar esses dados para melhorar a qualidade de recompilações adicionais.

O compilador JIT pode ser desativado, nesse caso, todo o programa Java será interpretado. Desativar o compilador JIT não é recomendável, exceto, para diagnosticar ou obter soluções alternativas para problemas de compilação JIT.