JVM, JDK, JRE

반응형
SMALL

JVM

JVM이란 JAVA Virtual Machine으로, 자바 가상 머신을 의미한다. Java 소스 코드는 javac 컴파일러로 거쳐 바이트코드로 변환되는데, 이 바이트코드는 JRE에 들어있는 Java classloader에 의해 JVM에 적재되고, JVM은 적제된 바이트 코드를 JIT 컴파일 방식으로 실행하는 컴퓨터의 OS 및 CPU 아키텍처용 기계어로 번역되어 수행된다.

즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

 

etc-image-0

Java 가상머신이라고 해서 Java 바이트코드만 인식하는 것은 아니다. 이 바이트코드를 Java가 아닌 다른 언어(
Kotlin이나 Scala, Groovy 같은 언어)를 가지고도 생성할 수 있기 때문이다. 따라서 지금의 Java 가상머신은 Java만을 위한 것이라고 생각하면 안 된다. 

 

JVM 구성요소

etc-image-1

JVM은 단순히 "코드를 실행하는 엔진" 그 이상입니다. 내부적으로 여러 가지 모듈이 유기적으로 동작하면서 자바 애플리케이션을 실행합니다. 

CLASS LOADER

클래스 로더는 .class 파일(바이트코드)을 JVM 내로 로딩하는 역할을 합니다. 즉, 자바 애플리케이션을 실행할 때 필요한 클래스 파일들을 메모리로 올려주는 역할을 하며, JVM 실행의 첫 단계를 담당합니다.


RUNTIME DATA AREA

Runtime Data Area는 JVM이 실행되는 동안 메모리를 관리하는 공간입니다. 여러 영역으로 나누어져 있으며, 각각의 역할이 다릅니다.

  • 메서드 영역(Method Area) : 클래스에 대한 구조적인 정보(필드, 메서드, static 변수 등)를 저장합니다.
  • 힙 영역(Heap Area) : 객체가 생성되는 영역으로, 대부분의 인스턴스가 이곳에 할당됩니다. 이 영역은 **가비지 컬렉터(GC)**가 자동으로 메모리를 관리합니다.
  • 스택 영역(Stack Area) : 각 스레드마다 존재하며, 메서드 호출 시 프레임이 쌓입니다. 지역 변수, 매개변수 등이 저장됩니다.
  • PC 레지스터(PC Register) : 각 스레드가 현재 실행 중인 명령어의 주소를 저장하는 공간입니다.
  • 네이티브 메서드 스택(Native Method Stack) : C나 C++로 작성된 네이티브 코드를 실행할 때 사용되는 스택입니다.

EXECUTION ENGINE (실행 엔진)

Execution Engine은 JVM이 로딩한 바이트코드를 실제 기계어로 변환하여 실행하는 역할을 합니다.

  • 인터프리터(Interpreter) : 바이트코드를 한 줄씩 읽고 해석하여 즉시 실행합니다.
  • JIT Compiler (Just-In-Time Compiler) : 인터프리터로 실행 중, 자주 호출되는 메서드(HotSpot)가 발생하면 해당 코드를 네이티브 코드로 변환하여 성능을 최적화합니다.

JIT Compiler 덕분에 JVM은 단순한 인터프리팅 언어 이상의 성능을 발휘할 수 있습니다.


NATIVE INTERFACE (JNI)

JNI(Java Native Interface)는 JVM 외부의 네이티브 라이브러리(C, C++ 등)를 호출할 수 있도록 브릿지 역할을 합니다. JVM이 제공하지 않는 기능이나, 시스템 레벨에서 처리해야 할 작업을 JNI를 통해 외부 코드로 위임합니다.


NATIVE METHOD LIBRARIES

C나 C++로 작성된 네이티브 코드 라이브러리(.dll, .so 등)가 저장되어 있는 공간입니다. JNI가 호출하는 대상이 되는 코드가 이 영역에 위치합니다.


JVM 실행 흐름

  1. 개발자가 작성한 .java 파일을 javac로 컴파일하여 .class 파일(바이트코드)을 생성합니다.
  2. JVM이 실행되면서 Class Loader가 .class 파일을 JVM 메모리로 로딩합니다.
  3. 로딩된 클래스는 Runtime Data Area에 필요한 데이터와 함께 적재됩니다.
  4. Execution Engine이 바이트코드를 읽어 인터프리터 또는 JIT Compiler를 통해 기계어로 변환하여 실행합니다.
  5. 필요한 경우 JNI를 통해 네이티브 코드를 호출하여 동작을 수행합니다.

JVM 특징

  • 플랫폼 독립성
    JVM 위에서 실행되므로 OS에 종속되지 않고, "Write Once, Run Anywhere"를 실현할 수 있습니다.
  • GC 관리
    Heap 영역의 메모리는 JVM 내부의 가비지 컬렉터가 자동으로 관리해주므로, 메모리 해제를 직접 처리하지 않아도 됩니다.
  • 성능 최적화
    JIT Compiler를 통한 네이티브 코드 변환으로 인터프리터 방식보다 빠른 실행 속도를 확보할 수 있습니다.

JRE

JRE란 JAVA Runtime Environment 로 자바 프로그램을 "실행"하기 위한 환경을 의미한다. 구성요소는 jvm과 자바 표준 라이브러리가 있어 사용자가 이미 컴파일된 자바프로그램(.class 파일)을 실행할 때 필요하다. 즉, 자바로 만들어진 프로그램을 단순히 실행만 할 사용자라면 JRE만 설치해도 충분하다. 예를 들면 게임 실행기에 비유할 수 있는데, 게임(자바 프로그램)을 개발하는 것이 아닌, 단지 실행하는데 필요한 런타임 환경만 제공하는 것이다.

JDK

JDK는 JAVA Development Kit로 자바프로그램을 개발하기 위한 도구 세트이다. JRE와 여러 개발 도구(javac,jdb,javadoc 등)으로 이루어져 있으며, 자바 소스코드를 작성하고 컴파일하여 실행 가능한 .class 파일(바이트 코드)로 변환할 때 사용한다. 이는 게임 개발 툴킷에 비유되어, 개발 도구와 실행 도구가 모두 포함된 패키지를 의미한다.

💡 JVM은 바이트코드를 실행하는 엔진, JRE는 JVM + 라이브러리(실행환경), JDK는 JRE + 개발 도구(개발 환경)입니다.
즉, JDK 안에 JRE가 포함되어 있고, JRE 안에 JVM이 포함되어 있습니다.
구조 관계: JDK > JRE > JVM
반응형
LIST

'cs정리 > java' 카테고리의 다른 글

JAVA 개념과 특징  (0) 2025.03.17
OOP란?(Object-Oriented Programming)  (0) 2025.03.17