JVM는 Java Virtual Machine이다. 보통 Java의 바이트 코드를 실행하는데 사용하나, 사실 바이트 코드만 있으면 전부 실행이 가능하기 때문에, 꼭 그 바이트 코드를 만드는 언어가 Java가 아니어도 된다.
즉, 이름에 Java가 들어가지만 바이트 코드를 만들 수 있는 언어면 어떤 언어든 상관 없는 것이다.
JVM은 여러 가지 구현체가 있으며 가장 유명한건 썬 마이크로시스템즈에서 개발한 HotSpot VM이다.
컴파일에는 정적 컴파일과 동적 컴파일 두 종류가 존재한다.
정적 컴파일은 C, C++ 같이 미리 기계어로 변환 후 실행하는 것을 뜻하며, 동적 컴파일은 프로그램 실행 도중에 기계어로 변환하는 것을 뜻한다.
Java는 javac가 코드를 바이트 코드로 변환해주고, 변환한 바이트 코드를 JVM에서 읽어 기계어로 변환해주는 과정을 거친다. 인터프리터 방식이라고도 말할 수 있다.
그러나 일반적인 인터프리터 방식은 최적화 없이 한 줄씩 읽어 기계어로 컴파일하므로 성능이 낮은데, JIT 컴파일러는 이를 해결해준다.
JIT 컴파일러는 동적 컴파일로 작동하는데, 컴파일하면서 코드를 스캔하여 자주 등장하는 코드를 기계어로 변환 후 캐싱해둔다. 이를 이용해 시간을 상당히 줄일 수 있다.
JIT 컴파일러는 JVM 환경에 포함되어 있으므로, 따로 신경쓰지 않아도 된다.
추가로 이런 cpython의 성능을 해결하기 위해 pypy가 등장했고 pypy는 JIT 컴파일러를 사용해 속도가 cpython보다 훨씬 빠르다.