Java uses javac (compiler) to convert the java code to byte code (.class file).
When we run this code using JVM, it internally converts the byte code to system understandable code using an interpreter.
Instead of executing a piece of code, again and again, JVM identifies them as “hot spots” and compiles them using Just in time compiler and, later reuses the same when required.
A compiler compiles (translates) the given program to executable code (whole code at a time). A JIT compiler performs a similar task but it is used by JVM internally, to translate the hotspots in the bytecode.