Entendo que uma JVM interpreta / JITs obytecodes; e que a JVM fornece a funcionalidade de geração de código de máquina específica da plataforma (e tempo de execução) para executar o programa, no contexto atual.
Gostaria de entender quais opções de ajuste de geração de código específicas da plataforma estão disponíveis na JVM. Eu encontrei https://docs.oracle.com/cd/E21764_01/web.1111/e13814/jvm_tuning.htm#PERFM167, que na verdade são apenas sinalizadores para ajustar o tempo de execução da JVM.
Estou interessado em saber se a JVM permite opções de ajuste para geração de código para uma plataforma específica, assim como o gcc no x86 https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#x86-Options.
Respostas:
1 para resposta № 1Primeiro de tudo, os sinalizadores da JVM são fundamentalmentediferente dos sinalizadores de otimização do GCC. Os sinalizadores do GCC afetam o código gerado no momento da compilação. As opções da JVM (na medida em que afetam a compilação do JIT) NÃO afetam o bytecode.
Existem vários sinalizadores que afetam o código nativo emitido pelo compilador JIT; por exemplo:
- o
-ea
As opções determinam se as asserções são verificadas. - o
-server
A opção (em parte) controla quando o código é o compilador JIT que afeta sua otimização. o-Xcomp
opção faz o mesmo. - o
-Xint
e-Xmixed
afetar se o código é JIT compilado.
Depois, existem opções que alteram especificamente coisas específicas relacionadas à otimização. Esses incluem -XX:ObjectAlignmentInBytes
, -XX:CompressedOops
, -XX:AggressiveOpts
, a -XX:AllocatePrefetch
opções, -XX:DoEscapeAnalysis
, a -XX:Inline
opções, -XX:OptimizeStringConcat
, a -XX:UseAES
opções e as -XX:UseSHA
opções.
Para uma lista mais completa, consulte a documentação do Oracle para sua plataforma.
Observe que:
- Toda a otimização de código JIT é específica da plataforma, no sentido em que o compilador JIT otimiza para o hardware em que você está realmente executando.
- Algumas das opções acima são específicas da plataforma (consulte a documentação)
- o
-X
e-XX
As opções podem mudar entre as versões Java. - Programadores Java normalmente permitem que a plataforma selecione as configurações de otimização. Ao contrário de (digamos) C ou C ++, os programas Java normalmente são menos sensíveis às configurações de otimização1.
1 - Para um código Java de thread único, as configurações de otimização não devem alterar o comportamento de um programa. Para um código multiencadeado, o comportamento de um incorreta aplicação pode mudar devido a inadequado sincronização.