Ответ 1
Интерпретация байтового кода в основном считывает байт-код по строкам, не делает никакой оптимизации или что-то еще, и анализирует его и выполняет его в режиме реального времени. Это особенно неэффективно по ряду причин, включая проблему, с которой байт-код Java не предназначен для быстрого интерпретации.
Когда метод компилируется, JIT загружает весь метод и генерирует собственный код для запуска непосредственно на ЦП, а не чтение и интерпретацию байтового кода по строкам. После того, как метод скомпилирован один раз, сгенерированный собственный код используется напрямую при каждом вызове метода. Это астрономически быстрее, но накладывает некоторые накладные расходы при компиляции метода; среди прочего, JVM отвечает только за компиляцию часто называемых методов, чтобы минимизировать накладные расходы, одновременно увеличивая производительность кода "жесткого внутреннего цикла", который вызывается очень часто.