JDK(Java Development Kit) : 자바 개발 키트. 개발자들이 자바로 개발하는 데 사용되는 SDK 키트라 생각하면 된다. 자바로 개발 시 필요한 API와 javac, javadoc 등의 개발 도구들을 포함하고 있다.
JRE(Java Runtime Environment) : 자바 실행 환경. JVM과 자바 프로그램을 실행(동작)시킬 때 필요한 라이브러리 API가 함께 묶여서 배포되는 패키지.
JRE만 설치하면 자바를 컴파일하는 등의 각종 개발 도구들이 제외된 상태로 설치된다. 하지만 JDK11 버전부터는 JDK, JRE가 따로 제공되지 않아서 따로 설치할 수 없다고 한다.
JVM(Java Virtual Machine) : 자바 프로그램을 실행하기 위한 가상 머신. 자바로 작성된 모든 프로그램은 JVM(자바 가상 머신)에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
JVM을 사용함으로써 얻는 가장 큰 이점은 JVM을 사용하면 자바 프로그램을 모든 플랫폼에서 제약 없이 동작하도록 할 수 있다는 점이다.
C언어는 컴파일러에 의해 한 번에 Binary code(기계가 읽을 수 있는 이진 코드, 기계어)로 변환되는데, 특정 OS나 CPU 구조에 맞춰진 컴파일러에 의해 다르게 컴파일된다는 특징이 있다.
그래서 컴파일러는 같은 형식의 기계어를 만들어내지만, 각 OS 환경에 맞춰진 독자적인 컴파일러이기 때문에 다른 환경(다른 OS, CPU 구조)에서는 이해하지 못한다. 그래서 OS에 따라서 코드가 달라져야 한다.
이를 두고 이식성이 낮다는 표현을 사용한다.
이에 반해 자바는 OS에 종속적이지 않다는 특징을 가지고 있다. 이것이 가능한 핵심적인 이유가 바로 JVM 덕분이다.
자바로 작성한 소스파일은 직접 운영체제로 가서 실행하는 것이 아닌, JVM을 거쳐서 운영체제와 상호작용을 하게 된다.
자바 프로그램이 컴파일되어 실행되는 과정은 다음과 같다.
자바 프로그램 실행과정을 나타낸 또다른 그림은 위와 같다.
간과하지 말아야 할 점은 자바 프로그램과는 달리 JVM은 운영체제에 종속적이므로, 각 운영체제에 맞는 JVM을 설치해야 한다는 점이다.
사용자 입장에서는 C 프로그램을 실행하나, 자바 프로그램을 실행하나 별 차이가 없다. 하지만 개발자 입장에서는 하나의 자바 코드로 여러 OS에 적용할 수 있어서 생산성과 효율성이 높아진다는 큰 장점을 가진다.
자바는 프로그램을 실행할 때 두 번의 변환 작업을 거치기 때문에 상대적으로 실행 속도가 느리다는 단점이 존재한다.
이를 보완하기 위해 JIT 컴파일러를 사용하여 필요한 부분만을 기계어로 바꾸어 줌으로써 성능 향상을 가져오도록 했다.