Java 언어를 잘 이해하기 위해서 JVM(Java Virtual Machine)의 구조 파악이 선행되어야 한다.
자바 파일을 실행하기 위해 JVM이 어떻게 실행되는지 간략하게 알아보자.
위 그림을 순서대로 정리하면 다음과 같다.
- 소스코드(.java)를 작성한다.
- 컴파일러(Compiler)가 자바 소스코드를 이용하여 클래스 파일을 생성한다. javac 명령어로 컴파일을 진행한다.
- 컴파일된 클래스 파일(.class) 파일은 JVM이 인식할 수 있는 바이트 코드 파일이다.
- JVM은 클래스 파일의 바이트 코드를 해석하여 바이너리 코드로 변환한다.
- 프로그램이 실행된다.
✔️ 바이트 코드(Byte Code)란?
가상 컴퓨터(Virtual Machine)에서 돌아가는 실행 프로그램을 위한 이진 표현법
이제 위 그림에서 빨간색 박스로 표시된 JVM의 동작 방식에 대해 자세히 알아보고자 한다.
JVM은 클래스 로더(Class Loader), 실행 엔진(Execution Engine), 런타임 데이터 영역(Runtime Data Area)로 구성되어 있다.
1. 클래스 로더 (Class Loader)
소스 코드를 작성하면 .java 파일이 생성된다. 이러한 .java 파일은 컴파일러(javac)에 의해 자바 바이트 코드(.class)로 컴파일된다. 컴파일 된 바이트코드를 클래스 로더가 Runtime Data Area로 적재하는 역할을 한다.
클래스 로더는 바이트 코드(.class) 파일들을 엮어서 JVM 메모리 영역인 Runtime Data Areas에 배치한다.
순서는 Loading -> Linking -> Initialization 로 로딩이 구성된다.
- Loading(로드) : 클래스 파일을 가져와서 JVM의 메모리에 로드한다.
- Linking(링크) : 검증하는 과정이다.
- Verify(검증) : JVM에 명시된 대로 구성되어 있는지 확인한다.
- Prepare(준비) : 클래스가 필요로 하는 메모리를 할당한다.
- Resolve(분석) : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
- Initialization(초기화) : 클래스 변수들을 적절한 값으로 초기화한다.
2. 실행 엔진 (Execution Engine)
클래스 로더를 통해 런타임 데이터 영역(Runtime Data Area)에 배치된 바이트 코드(.class)를 명령어 단위로 읽어서 실행한다.
실행 엔진에서 자바 바이트 코드는 가상 머신이 이해할 수 있는 컴파일 된 코드로 JVM 내부에서 기계가 바로 수행할 수 있도록 한다. Java Interpreter와 JIT Compiler를 통해 바이트 코드를 실행한다.
3. 런타임 데이터 영역 (Runtime Data Area)
자바 프로그램을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
크게 Method Area, Heap, Stack, PC Register, Native Method Stack가 있다.
- 메서드 영역 (Method Area) : 모든 스레드가 공유 가능한 영역
- 힙 영역 (Heap Area) : 메서드 안에서 사용되는 객체들을 위한 영역
- 스택 영역 (Stack Area) : 스레드가 시작될 때 할당
- PC 레지스터 (Program Counter Register) : 스레드가 시작될 때 할당
- 네이티브 메서드 스택 (Native Method Stack) : 네이티브 코드를 수행하기 위한 메모리 영역
참고
https://honbabzone.com/java/java-jvm/
JVM( Java Virtual Machine )이란
JAVA를 공부하는 데 있어 기본이 되는 JVM이 무엇인지 학습하고, JVM의 메모리 구조와 Garbage collector, Execution Engine, Class Loader에 대한 기본적인 설명 등 JVM이 어떻게 돌아가는지에 대한 기초를 잡는
honbabzone.com
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
JVM이란 무엇인가 Java Virtual Machine의 줄임말. 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다. Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되
doozi0316.tistory.com
https://interviewnoodle.com/how-does-classloader-work-in-java-96904ab25eef
How does Classloader work in Java?
What is the ClassLoader subsystem?
interviewnoodle.com
https://chamalwr.medium.com/inside-the-jvm-part-05-execution-engine-15857827ac82
Inside the JVM — Part 05 (Execution Engine)
Execution engine is responsible for executing the program and How actually it does that?
chamalwr.medium.com
'Java' 카테고리의 다른 글
[Java] equals()와 hashCode() 메서드 알아보기 (1) | 2024.05.15 |
---|---|
[Java] Call by value, Call by reference 차이 (0) | 2024.05.10 |