How does JVM compile and execute java code?
매번 JAVA 프로그래밍을 위해서 JDK를 설치하지만 그것이 무엇인지는 제대로 몰랐습니다. 왜 JDK가 필요하며 JAVA 코드를 작성하고 이것이 어떻게 컴파일되어 실행될 수 있는지 알아보겠습니다.
- JDK = JRE + Developer tools
- JRE = JVM + Class Library
✅ JDK
JDK(Java Development Kit)는 자바 개발을 위한 개발 도구 세트입니다. JDK에는 자바 프로그래밍 언어를 작성, 컴파일, 디버그 및 실행하기 위한 여러 도구와 라이브러리가 포함되어 있습니다. JDK는 Java 개발에 사용되며, Java 프로그램을 컴파일하고 디버그하는 데 필요한 모든 실행 파일, 이진 파일 및 도구를 제공합니다.
JDK 안에는 자바 개발에 필요한 여러 패키지가 포함되어 있습니다. 여러 패키지를 총합하여 JDK라고 합니다. 구성 목록은 아래와 같습니다.
- Developer tools
- JRE : Java 프로그램을 실행한데 필요한 런타임 환경
- JVM : 바이트 코드를 기계어로 실행할 가상 머신
- JIT : 실제적으로 바이트 코드를 해석하는 인터프리터
✅ JRE
JRE(Java Runtime Environment)는 자바 애플리케이션을 실행하기 위한 런타임 환경을 제공하는 소프트웨어 패키지입니다. JRE에는 자바 가상 머신(JVM, Java Virtual Machine)과 자바 클래스 라이브러리가 포함되어 있습니다.
- JVM : 바이트 코드를 기계어로 실행할 가상 머신
- Java Class Library : 입출력, 네트워킹, GUI, 데이터베이스 액세스, 보안 등의 기능을 제공하는 라이브러리
✅ JVM
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신입니다. JVM은 자바 바이트코드를 기계어로 변환하고 실행하는 역할을 담당합니다. JVM은 다음과 같은 기능을 가지고 있습니다.
- 바이트코드 해석
JVM은 자바 바이트코드를 해석하여 해당 플랫폼에서 실행 가능한 기계어로 변환합니다. 이러한 해석 단계에서 JVM은 자바 프로그램의 로직을 실행하고, 필요한 메모리 및 리소스를 관리합니다.
- 메모리 관리
JVM은 자바 프로그램이 사용하는 메모리를 관리합니다. 이를 통해 자동적인 메모리 할당 및 해제, 가비지 컬렉션(Garbage Collection) 등의 기능을 제공하여 개발자가 명시적으로 메모리를 관리하는 부담을 줄여줍니다.
- 스레드 관리
JVM은 멀티스레드를 지원하고 스레드 스케줄링을 관리합니다. 이를 통해 동시에 여러 작업을 수행하고, 여러 스레드 간의 동기화를 제공하여 병렬적이고 안정적인 실행 환경을 제공합니다.
- 예외 처리
JVM은 자바 프로그램에서 발생하는 예외를 처리합니다. 이를 통해 예외 상황을 감지하고 적절한 예외 처리 메커니즘을 통해 프로그램의 안정성을 유지합니다.
👉 JVM의 구현체는 많은 것이 있지만 가장 널리 사용하는 것은 “HotSpot” 입니다.
- Oracle JVM (HotSpot)
Oracle이 제공하는 JVM 구현체로 가장 널리 사용되고 성능이 우수한 구현체입니다. 대부분의 자바 개발자들이 이 구현체를 사용합니다.
- Oracle JVM (HotSpot)
✅ JIT
JIT(Just In Time) 컴파일러는 일반적인 인터프리터와 정적 컴파일러의 장점을 결합한 형태로, 프로그램의 실행 시점에 바이트 코드를 컴파일하여 기계어 코드로 변환합니다. Javac 컴파일러가 java 소스코드를 바이트 코드인 .class 파일 확장자로 변경하며 최적화해주기 때문에 다른 인터프리트보다 더 빨리 기계어 코드로 변환할 수 있습니다.
일반적인 인터프리터는 바이트 코드를 한 줄씩 컴파일하여 실행하여 JIT나 정적 컴파일러에 비해서 실행 시간이 상대적으로 느릴 수 있습니다.
정적 컴파일러는 실행 전에 무조건 전체 코드를 컴파일 해야 하기 때문에 다양한 플랫폼에 맞게 컴파일 하려면 컴파일 시간이 오래 걸리지만, 컴파일 시에 최적화를 수행하여 최상의 성능을 추구할 수 있습니다.
✅ JVM에서 Java 코드는 어떻게 컴파일되고 실행되는가?
각 구성 요소를 살펴보았으니 Java 프로그램이 어떻게 실행되는지 흐름을 살펴보겠습니다.
- 개발자가 Java 소스 코드( .java )를 작성합니다.
- 자바 컴파일러( javac compiler )가 자바 소스 코드를 컴파일하여 바이트 코드( .class )로 변환합니다.
→ 바이트 코드는 JVM이 실행할 수 있는 중간 언어로, 일련의 바이트로 이루어진 형식입니다.
- 컴파일된 바이트 코드 ( .class )를 JVM에게 전달하여 기계어(Machine code)로 컴파일 되어 실행됩니다.
간단하게 개발자가 작성한 Java 코드가 어떻게 컴파일되고 실행되는지 알아보았습니다. Java 언어는 JVM 가상환경에서 실행되며 이로 인해 CPU나 OS에 종속적이지 않을 수 있게 되었습니다.
Uploaded by N2T