배너 이미지

자바 컴파일 과정

2025. 4. 23. 23:09·CS공부/Java & Spring

자바 프로그램이 실행되는 과정은 크게 로드, 검증, 준비, 분석, 초기화라는 다섯 가지 단계로 나눠볼 수 있다.
각 단계는 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
'CS공부/Java & Spring' 카테고리의 다른 글
  • Spring Boot의 Bean과 어노테이션
  • MVC 모델이란 무엇인가?
  • Call by Reference와 Call by Value
  • Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리
quokkaST
quokkaST
  • quokkaST
    stquokka
    quokkaST
    • 개발자 (77)
      • n8n (2)
      • CS공부 (46)
        • Java & Spring (15)
        • 인프라 (7)
        • 운영체제 & 시스템 (9)
        • 기타 CS지식 (7)
        • 네트워크 (6)
        • 데이터베이스 (2)
      • 알고리즘 (16)
      • 프로젝트 (8)
        • 감정&금융챗봇 (8)
      • 리팩토링 (5)
        • horong (5)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바