Если кратко, то java компилируемый язык. Длинно:
Вариант 1, практически везде используемый:
Исходники java компилируются в байт код. Байт код интерпретируется на JVM (java virtual machine) и часть байт кода компилируется (JIT just in time компиляция) в машинный код. Это даёт возможность оптимизировать код лучше чем при компиляции в машинный код перед выполнением (AOT ahead of time компиляция). Преимущества - после "прогрева" - как только код будет скомпилирован в машинный - более высокая производительность чем в случае AOT компиляции. Минус - требуется гораздо больше памяти и время для "прогрева"
Вариант 2, используемый, например, twitter.(https : //jaxenter.com/graalvm-chris-thalinger-interview-163074.html)
Исходники java компилируются в байт код. Байт код и часть JVM компилируется в машинный код (AOT). Преимущества - существенно меньше требуется памяти, приложение стартует быстро. Минусы - производительность поменьше чем у JIT после "прогрева", о всех используемых классах надо знать ещё на стадии компиляции.
смотри GraalVM