자바는 다양한 운영체제에서 동일한 코드로 실행되는 OS에 독립적인 특징을 가지고 있습니다. 이것이 가능한 이유는 JVM(Java Vitual Machine) 덕분입니다. JVM(Java Vitual Machine)의 어떠한 기능 때문에 OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보도록 하겠습니다.
자바 컴파일 과정 순서
① .java 파일 작성
개발자는 자바 소스코드 파일을 작성합니다.
② javac 컴파일러 → 바이트코드 생성 (.class 파일)
작성된 소스 파일은 자바 컴파일러(javac)에 의해 컴파일되어 .class 파일이 생성됩니다.
이 .class 파일에는 바이트코드(Bytecode) 라는 중간 형태의 코드가 들어 있습니다.
- 이 코드는 CPU가 직접 실행할 수 있는 기계어가 아닌,
- JVM이 이해할 수 있도록 설계된 플랫폼 중립적 코드입니다.
- 각 명령어는 1바이트의 Opcode + 피연산자로 구성됩니다.
즉, 이 단계까지만 보면 OS에 독립적인 코드가 탄생한 것입니다.
③ Class Loader가 메모리로 로드
컴파일된 .class 파일은 JVM의 클래스 로더(Class Loader)에 의해 메모리에 로드됩니다.
클래스 로더는 다음과 같은 5단계 과정을 거칩니다.
클래스 로더 세부 동작 단계
- 로딩(Loading)
.class 파일을 읽어 JVM 메모리로 적재 - 검증(Verification)
바이트코드가 자바 언어와 JVM 명세에 부합하는지 확인 - 준비(Preparation)
클래스에 필요한 정적(static) 메모리 구조를 생성 - 분석(Resolution)
심볼릭 레퍼런스를 실제 메모리 주소(다이렉트 레퍼런스)로 치환 - 초기화(Initialization)
static 변수 등을 실제 값으로 초기화
④ 실행 엔진이 바이트코드 실행
이제 메모리에 올라온 바이트코드는 실행 엔진(Execution Engine)에 의해 실행됩니다.
실행 엔진은 바이트코드를 기계어 수준으로 해석하거나 변환하여 실행합니다.
방식은 두 가지입니다.
1. 인터프리터(Interpreter)
- 바이트코드를 한 줄씩 읽고 실행
- 처음 실행 속도는 빠르지만 전체 성능은 느림
2. JIT 컴파일러(Just-In-Time Compiler)
- 자주 실행되는 메서드를 모니터링하고, 그 코드를 기계어로 변환
- 이후부터는 인터프리팅 없이 빠르게 실행 가능
- 인터프리터 + JIT 방식이 JVM의 기본 구조
'Development & Projects > Java' 카테고리의 다른 글
[Java] 상속 정리 / 다중 상속 / 다이아몬드 문제 (0) | 2025.09.21 |
---|---|
[Java] 추상 클래스와 인터페이스 정리 (0) | 2025.09.20 |
[Spring Boot] @Valid 유효성 검사가 되지 않을 때 (0) | 2025.05.12 |
[Spring boot] @Transactional 이란? (0) | 2025.04.08 |
[Spring Boot] GlobalExceptionHandler 예외 처리 (0) | 2025.04.06 |