¿Por qué es Java más rápido cuando se usa un JIT en lugar de compilar en un código de máquina?

He oído que Java debe usar un JIT para ser rápido. Esto tiene mucho sentido cuando se compara con la interpretación, pero ¿por qué alguien no puede hacer un compilador adelantado que genere código Java rápido? Se acerca degcj, pero no creo que su salida sea típicamente más rápida que Hotspot, por ejemplo.

¿Hay cosas sobre el lenguaje que hacen esto difícil? Creo que todo se reduce a estas cosas:

ReflexiónCarga de clases

¿Qué me estoy perdiendo? Si evito estas características, ¿sería posible compilar el código Java una vez a un código de máquina nativo y terminar?

Respuestas a la pregunta(10)

Su respuesta a la pregunta