Por que Java é mais rápido ao usar um código JIT vs. compilar para código de máquina?

Ouvi dizer que o Java deve usar um JIT para ser rápido. Isso faz todo o sentido quando se compara a interpretação, mas por que alguém não pode fazer um compilador antes do tempo que gere código Java rápido? Eu sei sobregcj, mas eu não acho que sua saída é tipicamente mais rápida que o Hotspot, por exemplo.

Existem coisas sobre a linguagem que tornam isso difícil? Eu acho que tudo se resume a essas coisas:

ReflexãoClassloading

o que estou perdendo? Se eu evitar esses recursos, seria possível compilar o código Java uma vez para o código de máquina nativo e ser feito?