O Compilador JIT

O compilador Just-In-Time (JIT) é um componente do ambiente de tempo de execução que melhora o desempenho de aplicativos Java™ compilando bytecodes para o código de máquina nativo no tempo de execução..

Programas Java consistem em classes, que contêm bytecodes neutros em plataforma que podem ser interpretados por uma JVM em muitas arquiteturas de computador diferentes. 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 de processador e 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 em código de máquina nativo no tempo de execução

O compilador JIT está ativado por padrã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 exigia tempo de processador e uso de memória, compilar cada método poderia permitir a velocidade do programa Java para corresponder a 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étodo, a JVM mantém uma contagem de chamada, que inicia em um valor limite de compilação predefinido e diminui toda vez que o método é chamado. Quando a contagem de chamada chega a zero, uma compilação JIT para o método é acionada. 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 valor do limite foi selecionado para obter um balanceamento ideal entre os tempos de inicialização e o desempenho de longo prazo.

O compilador JIT pode compilar um método em diferentes níveis de otimização: cold, warm, hot veryHotou scorching (consulte optlevel em -Xjit). Espera-se que níveis de otimização mais altos forneçam melhor desempenho, porém o custo de compilação é maior em termos de CPU e memória. O nível de otimização inicial ou padrão para um método é warm, mas às vezes as heurísticas do JIT fazem downgrade do nível de otimização para cold para melhorar o tempo de inicialização.

Um método pode ser recompilado para um nível de otimização superior por meio de diferentes mecanismos. Um desses mecanismos é a amostragem: o compilador JIT mantém um encadeamento de amostragem dedicado que acorda periodicamente e determina quais métodos Java aparecem mais frequentemente na parte superior da pilha. Tais métodos são considerados mais importante para desempenho e são candidatos a uma nova otimização em níveis mais altos de hot, veryHot ou scorching.

É possível desativar o compilador JIT, nesse caso o programa Java inteiro será interpretado. Desativar o compilador JIT não é recomendável, exceto, para diagnosticar ou obter soluções alternativas para problemas de compilação JIT.