Language/Java

JDK/JRE/JVM, 자바 프로그램의 실행 과정

olsohee 2023. 12. 18. 16:45

JDK(Java Development Kit)

JDK는 자바 개발 키트(Java Development Kit)의 약자로, 개발자들이 자바로 개발하는 데 사용되는 SDK(Software Development Kit)라고 생각하면 된다. JDK 안에는 자바로 개발하는 데 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들이 포함되어 있고, 자바 프로그램을 실행시켜줘야 하기 때문에 JRE도 포함되어 있다. 즉 JDK는 JVM, JRE를 모두 포함하고 이외에도 자바로 개발하는 데 필요한 Development Tools를 포함하고 있다.

자바 버전

Java 11, Java 17과 같이 여러 버전이 있는데 이 버전은 JDK의 버전을 의미한다. 그래서 자바를 설치한다는 것은 JDK를 설치한다는 의미이다. 자바 버전은 다음과 같이 표기한다.

  • 주 버전: 자바 언어에 많은 변화가 있을 경우 증가
  • 개선 버전: 주 버전에서 일부 사항이 개선될 때 증가
  • 업데이트 버전: 1~3개월 주기로 버그가 수정될 때마다 증가
  • LTS(Long Term Support): 장기 지원 서비스를 받을 수 있는 버전

JDK 디렉토리 구성요소

JDK를 설치하면 다음과 같은 디렉토리가 생긴다.

  • bin: 자바 개발, 실행에 필요한 도구와 유틸리티 명령
  • include : 네이티브 코드 프로그래밍에 필요하는 C언어 헤더 파일
  • lib : 실행 시간에 필요한 라이브러리 클래스들

그 중 bin 디렉토리에 들어 있는 대표적인 요소는 다음과 같다.

  • javac: 자바 컴파일러로 자바 소스 코드를 바이트 코드로 컴파일한다.
  • java: 자바 인터프리터로 컴파일러가 생성한 바이트 코드를 해석하고 실행한다.
  • javadoc: 자바 소스로부터 HTML 형식의 API document를 생성한다.
  • jar: 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar)을 생성, 관리하는 압축 프로그램이다. 

JRE(Java Runtime Environment)

JRE는 자바 실행 환경(Java Runtime Environment)의 약자로, JVM과 자바 API로 구성된다. JRE는 JDK에 포함되어 있기 때문에 JDK를 설치하면 함께 설치된다. 

JVM(Java Virtual Machine)

JVM은 자바 가상 머신(Java Virtual Machine)의 약자로 자바를 돌리는 프로그램이다. 자바로 작성된 모든 프로그램은 JVM을 통해서만 실행될 수 있으므로 자바 프로그램을 실행하기 위해서는 반드시 JVM이 설치되어 있어야 한다. 그리고 앞서 말했듯이 JVM은 JRE에 포함되어 있다.

JVM이 필요한 이유

JVM 덕분에 자바 프로그램은 OS에 종속적이지 않을 수 있다. 즉 하나의 자바 프로그램을 운영체제와 상관없이 어디서든 실행할 수 있다. 프로그램은 운영체제 위에서 실행된다. 따라서 본래 프로그램은 운영체제에 종속적이기 때문에 동일한 기능의 프로그램이라고 하더라도 다른 OS에서 실행시키려면 두 개의 프로그램을 작성해야 한다. 하지만 JVM 덕분에 자바 프로그램은 OS와 상관없이 하나의 프로그램을 어디서든 실행시킬 수 있다. 

  1. 자바 컴파일러가 자바로 작성된 소스 코드(.java 파일)를 바이트 코드(.class 파일)로 컴파일한다. (단, 바이트 코드는 직접 CPU에서 동작할 수 있는 코드가 아니고, JVM이 이해할 수 있는 코드이다.)
  2. JVM은 바이트 코드를 기계어(이진수의 바이너리 코드)로 변환한다.
  3. JVM에 의해 컴파일된 기계어는 바로 CPU에서 실행되어 사용자에게 서비스를 제공한다.

이러한 자바의 특징을 WORA(Write Once, Read Anywhere)라고 부른다. 즉 윈도우 환경에서 컴파일된 바이트 코드가 맥, 리눅스 환경에서도 동작할 수 있는데, 이는 JVM이 컴파일된 바이트 코드를 각 OS에 맞는 바이너리 코드(기계어)로 변환해주기 때문이다. 이를 이식성이 높다고 말한다.

 

단, JVM은 자바 프로그램과 달리 운영체제에 종속적이므로 각 운영체제에 맞는 JVM을 설치해야 한다. 그리고 자바 프로그램은 일반 프로그램보다 JVM이라는 한 단계를 더 거쳐야 하므로, 상대적으로 실행 속도가 느리다. 즉 두 번의 컴파일로 인한 속도 문제가 발생하는데, 이를 보완하기 위해 JIT 컴파일러를 사용하여 성능을 개선했다. (그럼에도 C언어의 실행 속도가 더 빠르며 게임이나 임베디드에서 C 언어를 사용하는 이유이다.)

JIT 컴파일러(Just In Time Compiler)

JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱한다. 그리고 이후에는 변경된 부분만 컴파일하고 나머지는 캐싱된 코드를 사용한다. 동적 번역이라고도 불리는 이 기법을 통해 이전의 자바 인터프리터(Interpreter) 방식보다 성능이 10~20배 더 좋아졌다.

자바 프로그램의 실행 과정

위에서 말했듯이 자바 프로그램은 JVM이라는 특성 때문에 두 번의 단계를 거쳐야 한다. 첫 번째는 .java 파일을 .class 파일로 바꾸는 컴파일 단계이고, 두 번째는 .class 파일을 이진수의 바이너리 코드로 변환하고 실행하는 단계이다.

위 그림에서 컴파일러는 javac.exe에 해당되고 JVM은 java.exe에 해당된다.

  1. 소스 코드인 .java 파일을 작성한다.
  2. 컴파일러는 컴파일 과정을 통해 .java 파일을 바이트 코드인 .class 파일로 변환한다. 이때 .class 파일은 JVM이 이해할 수 있는 바이트 코드 파일이다.
  3. JVM은 바이트 코드를 해석하여 이진수의 바이너리 코드로 변환하고 프로그램을 수행한다.

Reference