Почему Java быстрее при использовании JIT против компиляции в машинный код?

Я слышал, что Java должна использовать JIT, чтобы быть быстрым. Это имеет смысл при сравнении с интерпретацией, но почему кто-то не может создать опережающий компилятор, который генерирует быстрый Java-код? Я знаю оgcj, но я не думаю, что его вывод, как правило, быстрее, чем Hotspot, например.

Есть ли какие-то вещи в языке, которые затрудняют это? Я думаю, что это сводится только к этим вещам:

отражениезагрузки классов

Что мне не хватает? Если я буду избегать этих функций, возможно ли будет скомпилировать Java-код один раз в машинный код?