자바 프로그램이 실행되는 과정은 크게 로드, 검증, 준비, 분석, 초기화라는 다섯 가지 단계로 나눠볼 수 있다.
각 단계는 JVM에서 자바 바이트 코드가 실행 가능한 상태로 변환되는 중요한 과정이며, 이를 통해 자바 애플리케이션이 어떻게 작동하는지에 대해 알 수 있다.
✅ 1. 로드 (Loading)
- 로드 과정은 자바 클래스 파일을 JVM의 메모리에 올리는 과정이다.
- 자바 소스 코드(
.java)가 작성되면, 자바 컴파일러가 이를 바이트 코드(.class)로 컴파일한다. - 컴파일된 클래스 파일은 클래스 로더에 의해 동적으로 로딩되어 JVM 메모리에 업로드된다.
- 이 과정을 통해 프로그램 실행에 필요한 클래스가 메모리에 로드되며, 이후 실행에 필요한 데이터가 준비된다.
💡 핵심 포인트:
ClassLoader는 동적 로딩을 통해 클래스들을 필요할 때마다 메모리에 올린다.- 클래스 파일은 JVM이 실행할 수 있는 바이트 코드로 변환된다.
✅ 2. 검증 (Verification)
- 검증 과정은 자바 바이트 코드가 자바 언어 명세와 JVM 명세에 맞는지 확인하는 과정이다.
- 검증을 통해 보안성과 타입 안정성을 보장하며, 잘못된 바이트 코드가 JVM에 의해 실행되지 않도록 방지한다.
- 바이트 코드에서 잘못된 명령어가 포함되어 있거나 타입 오류가 있을 경우 이를 잡아내어 실행 오류를 미리 방지할 수 있다.
✅ 3. 준비 (Preparation)
- 준비 과정은 클래스가 실행되기 위해 필요한 메모리 공간을 할당하는 단계이다.
- 클래스 변수와 클래스 메서드가 메모리 내에 준비된다.
- 클래스 변수가 초기화되지 않은 상태로 메모리에 할당되고, 클래스의 상수 풀(Constant Pool)은 초기화된다.
✅ 4. 분석 (Resolution)
- 분석 과정에서는 클래스의 상수 풀(Constant Pool)에 포함된 심볼릭 레퍼런스들을 다이렉트 레퍼런스로 변경하는 단계이다.
- 이를 통해 실제 실행 시, 클래스 내부에서 참조하는 메서드, 변수 등과 같은 심볼릭 데이터를 실제 주소로 변환하여 JVM이 해당 객체를 참조할 수 있도록 만든다.
💡 핵심 포인트:
- 심볼릭 레퍼런스는 메모리 주소를 포함하지 않은 참조로, 실제 실행 시 다이렉트 레퍼런스로 변환되어야 한다.
✅ 5. 초기화 (Initialization)
- 초기화 과정은 클래스 변수들을 적절한 값으로 초기화하는 단계이다.
- 클래스 변수들은 static 키워드가 붙은 변수들로, 클래스 로딩 시 한 번만 초기화된다.
- 이 단계에서 클래스 변수가 초기화되고,
static블록이 실행된다.
💡 핵심 포인트:
- 클래스 변수들은 한 번만 초기화되며, 이 과정에서 메모리 공간에 할당된 값들이 실제로 사용될 준비가 된다.
✅ 실행 엔진 (Execution Engine)
- 실행 엔진은 인터프리터 방식과 JIT(Just-In-Time) 컴파일러 방식 두 가지로 작동한다.
1. 인터프리터 방식:
- 바이트 코드 명령어를 한 번에 하나씩 읽고 실행하는 방식이다.
- 이 방식은 명령어별로 실행이 빠르지만, 전체적인 실행 속도는 느리다는 단점이 있다.
2. JIT 컴파일러:
- JIT 컴파일러는 바이트 코드 전체를 컴파일하여 바이너리 코드로 변환한다.
- 그 후, 컴파일된 메서드를 바로 실행한다. 이 방식은 인터프리터 방식보다 훨씬 빠른 실행 속도를 제공한다.
- JIT 컴파일러는 프로그램의 핫스팟(자주 호출되는 메서드)을 우선적으로 컴파일하여 성능을 최적화한다.
💡 핵심 포인트:
- JIT 컴파일러는 실행 속도를 크게 개선하며, 자주 실행되는 부분을 최적화하여 성능을 향상시킨다.
📘 결론
- 자바 컴파일 과정은 로드, 검증, 준비, 분석, 초기화의 다섯 단계로 이루어지며, 각 단계는 자바 프로그램이 JVM에서 실행될 수 있도록 준비한다.
- 인터프리터와 JIT 컴파일러는 실행 성능에 큰 영향을 미치며, JIT는 프로그램 성능을 최적화하는 중요한 역할을 한다.
'CS공부 > Java & Spring' 카테고리의 다른 글
| Spring Boot의 Bean과 어노테이션 (1) | 2025.04.23 |
|---|---|
| MVC 모델이란 무엇인가? (0) | 2025.04.23 |
| Call by Reference와 Call by Value (0) | 2025.04.23 |
| Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리 (0) | 2025.04.22 |
| Spring Boot @Transactional 어노테이션 (0) | 2025.04.22 |