JVM (Java Virtual Machine)
JVM은 자바 가상 머신의 약자입니다. 이는 Java의 바이트 코드를 실행하는 역할을 담당합니다.
JVM은 소프트웨어로서, 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공합니다.

자바 프로그램을 소스 파일(. java)로 작성하고, 자바 컴파일러는 소스 파일을 컴파일하여 바이트 코드(. class)를 생성합니다.
변환된 바이트 코드는 기계어가 아니므로 OS에서 바로 실행될 수 없습니다.
이때 JVM이 Java와 OS사이에서 중개자 역할을 수행하여 OS가 바이트 코드를 이해할 수 있도록 도와줍니다.
JVM 구조

Class Loader (클래스 로더)
JVM이 실행 중 필요한 클래스를 동적으로 메모리에 올려 실행할 수 있게 해주는 역할입니다.
Execution Engine (실행 엔진)
클래스 로더가 JVM 내의 런타임 데이터 영역에 배치시킨 바이트 코드를 실행하는 역할입니다.
- Interpreter (인터프리터)
- 실행 엔진의 인터프리터는 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다.
- 한 줄씩 해석하고 실행하여 느립니다.
- JIT Compiler
- 인터프리터 방식의 단점을 보완하기 위한 방식입니다.
- 인터프리터 방식을 사용하다가 자주 사용되는 코드를 식별하여 바이트 코드를 기계어로 컴파일하고, 이후에는 기계어로 직접 실행하는 방식입니다.
- JVM은 모든 코드를 JIT Compiler 방식으로 실행하지 않고 인터프리터 방식을 사용하다가 특정 기준이 넘어가면 JIT Compiler 방식으로 실행합니다.
Garbage Collector (가비지 콜렉터)
런타임 데이터 영역의 Heap 메모리 영역에 적재된 객체 중 참조되지 않는 객체들을 탐색 후 제거하는 역할을 합니다.
Runtime Data Area (런타임 데이터 영역)
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.

- Method Area (메소드 영역)
- 프로그램 실행 중 클래스가 처음 사용되면 JVM은 해당 클래스 파일을 읽고 분석하여 클래스의 메타데이터를 Method Area에 저장합니다.
- 모든 JVM 스레드는 이 메소드 영역을 공유합니다.
- Java 8 이전에는 Method Area를 Heap 영역의 일부인 PermGen(Permanat Generation Space)에 할당했습니다.
- Java 8 이후에는 PermGen이 완전히 제거되고 Method Area는 Native Heap에 할당됩니다.
- 클래스 및 인터페이스 정보(클래스인지 인터페이스인지), 필드 및 메소드 정보(이름, 데이터 타입, 접근 제어자 등), Constant Pool(문자 상수, 타입, 필드, 객체 참조 저장), static 변수 등을 저장합니다.
- Heap Area (힙 영역)
- 프로그램상에서 런타임시 동적으로 할당하여 사용하는 영역입니다.
- new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.
- 가비지 컬렉터가 객체를 찾아 제거하는 작업의 대상 영역입니다.
- Stack Area (스택 영역)
- 변수, 임시 데이터, 스레드나 메소드의 정보를 저장합니다.
- 메소드가 수행될 때 내부에서 사용되는 값들을 저장한다. 호출된 메소드의 매개변수, 지역변수, 리턴 값을 임시로 저장합니다.
- 메소드 호출 시마다 각각의 스택 프레임이 생성됩니다. 메소드 수행이 종료되면 스택 프레임이 제거된다.
- PC Register
- Thread가 생성될 때마다 생기는 공간으로 Thread가 어떠한 명령을 실행하게 될지를 기록합니다.
- Native Method Stack
- 자바 외의 언어로 작성된 네이티브 코드를 위한 스택입니다.
- Java Native Inteface를 통해 호출하는 C/C++ 코드를 수행합니다.
참고
반응형
'Teck Stack > Java' 카테고리의 다른 글
| [JAVA] Static은 언제 사용할까? (0) | 2025.10.24 |
|---|---|
| [Java] Error와 Exception (0) | 2025.10.08 |
| [Java] Stream API와 for-loop의 성능 차이 (1) | 2025.09.25 |
| [JPA] Bulk Insert를 사용해서 쿼리 성능 개선하기 (0) | 2025.06.20 |
