A implementação JVM canônica da Sun aplica uma otimização bastante sofisticada ao bytecode para obter velocidades de execução quase nativas depois que o código foi executado algumas vezes.
A questão é: por que esse código compilado não é armazenado em cache no disco para uso durante os usos subsequentes da mesma função / classe?
Do jeito que está, toda vez que um programa é executado, o compilador JIT é ativado novamente, em vez de usar uma versão pré-compilada do código. Adicionar esse recurso não aumentaria significativamente o tempo de execução inicial do programa, quando o bytecode está essencialmente sendo interpretado?
Respostas:
Sem recorrer ao cut'n'paste do link que @MYYN postou, suspeito que seja porque as otimizações que a JVM realiza não são estáticas, mas sim dinâmicas, baseadas nos padrões de dados e também nos padrões de código. É provável que esses padrões de dados mudem durante a vida útil do aplicativo, tornando as otimizações em cache menos do que ideais.
Portanto, você precisaria de um mecanismo para estabelecer se as otimizações salvas ainda eram ótimas, ponto em que você também pode otimizar novamente em tempo real.
fonte
A JVM da Oracle está realmente documentada para fazer isso - citando a Oracle,
Não sei por que todas as implementações sofisticadas de VM não oferecem opções semelhantes.
fonte
Uma atualização para as respostas existentes - Java 8 tem um JEP dedicado a resolver isso:
=>
JEP 145: Código Compilado de Cache. Novo link .Em um nível muito alto, seu objetivo declarado é :
Espero que isto ajude.
fonte
Excelsior JET tem um compilador JIT de cache desde a versão 2.0, lançada em 2001. Além disso, seu compilador AOT pode recompilar o cache em um único objeto DLL / compartilhado usando todas as otimizações.
fonte
Não sei as reais razões, não estando de forma alguma envolvido na implementação da JVM, mas posso pensar em algumas plausíveis:
Mas eu realmente estou supondo, e como você pode ver, eu realmente não acho que nenhuma das minhas razões seja um obstáculo. Eu acho que a Sun simplesmente não considera esse suporte como uma prioridade, e talvez meu primeiro motivo esteja próximo da verdade, já que fazer isso normalmente também pode levar as pessoas a pensar que os arquivos de classe Java realmente precisam de uma versão separada para cada VM em vez de ser plataforma cruzada.
Minha forma preferida seria ter um tradutor separado de bytecode para nativo que você pudesse usar para fazer algo assim explicitamente de antemão, criando arquivos de classe que são explicitamente construídos para uma VM específica, possivelmente com o bytecode original neles para que você pode ser executado com diferentes VMs também. Mas isso provavelmente vem da minha experiência: tenho feito principalmente Java ME, onde realmente dói que o compilador Java não seja mais inteligente sobre compilação.
fonte