Javac - компілятор, але не традиційний компілятор. Компілятор, як правило, перетворює вихідний код на мову машинного рівня для виконання, і це робиться одним пострілом, тобто весь код береться і перетворюється на мову машинного рівня ОДИН раз. (докладніше про це нижче). Поки JavaC перетворює його у байт-код замість мови машинного рівня.
JIT є компілятором Java, але також виконує роль інтерпретатора. Типовий компілятор перетворює весь код відразу з вихідного коду на мову машинного рівня. Натомість JIT переходить рядок за рядком (виконання рядків за рядком є особливістю інтерпретаторів) і перетворює байт-код, сформований JavaC, у мову машинного рівня та виконує його. JVM, який містить JIT, має кілька реалізацій. Точка доступу - одна з основних для програмування на Java. Реалізація точки доступу змушує JIT оптимізувати виконання, перетворюючи відрізки коду, які повторюються, на мову машинного рівня одночасно (як компілятор, як згадано вище), щоб їх можна було виконати швидше, замість перетворення кожного рядка коду 1 на 1. Отже, відповідь не є чорно-білою щодо типових визначень Компілятора та Інтерпретатора.
Це моє розуміння після прочитання декількох онлайн-відповідей, блогів тощо. Якщо хтось має пропозиції покращити це розуміння, будь ласка, запропонуйте.