자바 컴파일 과정

2025. 1. 14. 13:50백엔드

1. 자바 컴파일 순서

출처 : https://steady-snail.tistory.com/67#%EC%9E%90%EB%B0%94_%EC%BD%94%EB%93%9C(JAVA_Code)_%EC%8B%A4%ED%96%89_%EA%B3%BC%EC%A0%95

 

자바 코드는 다음 과정을 거쳐 실행됩니다.

1. 개발자는 자바 소스 코드(.java)를 작성한 후, 이를 자바 컴파일러에 전달합니다.

2. 컴파일러는 소스 코드를 읽고 바이트코드(.class)로 변환합니다. 이 바이트코드는 컴퓨터가 직접 이해할 수 있는 기계어는 아니며, JVM(자바 가상 머신)에서 실행되기 위해 만들어진 코드입니다.

3. 컴파일된 바이트코드(.class)는 JVM 내의 클래스 로더로 전달됩니다.

4.클래스 로더는 동적 로딩을 통해 실행 중에 필요한 클래스들을 찾아서 로드하고, 링크 과정을 거쳐 JVM 메모리의 런타임 데이터 영역(Method Area)에 저장합니다.

5. 이후 실행 엔진(Execution Engine)이 메모리에 올라온 바이트코드를 명령어 단위로 가져와 해석하고 실행합니다.

이렇게 자바 프로그램은 컴파일부터 실행까지의 과정을 거쳐 동작하게 됩니다.

 

2. 클래스 로더와 실행 준비 과정

클래스 로더는 .class 파일을 메모리에 로드하고 프로그램 실행을 준비하는 역할을 합니다. 로더는 클래스를 로드한 후 링크와 초기화를 수행합니다. 링크 단계에서는 클래스 간의 의존성을 확인하고, 초기화 단계에서는 정적 변수나 초기화 블록이 실행됩니다.

클래스 로더는 계층적으로 작동하며, Bootstrap Class Loader가 JVM의 기본 클래스(e.g., java.lang.String)를 로드하고, 그 위에 Extension Class Loader와 Application Class Loader가 순서대로 동작해 사용자 정의 클래스와 라이브러리를 메모리에 올립니다.

 

3. JVM의 메모리 구조

JVM의 메모리는 런타임 데이터 영역으로 나뉘며, 각각의 역할이 다릅니다.

  1. Method Area는 클래스 구조, 메타데이터, 정적 변수, 그리고 상수 풀을 저장하는 공간입니다.
  2. Heap은 모든 객체와 인스턴스 변수가 저장되는 곳으로, 프로그램에서 생성한 객체가 관리됩니다. 이 영역은 가비지 컬렉션의 주요 대상입니다.
  3. Stack은 메서드 호출 시 생성되는 스택 프레임을 저장하며, 지역 변수, 연산 결과, 리턴 주소 등이 포함됩니다. 스레드마다 독립적으로 존재해 안전한 메모리 관리를 지원합니다.
  4. Program Counter (PC) Register는 현재 실행 중인 명령어의 주소를 저장합니다.
  5. Native Method Stack은 자바가 아닌 네이티브 언어(C/C++)로 작성된 코드를 실행할 때 사용됩니다.

 

4. 실행 엔진: 바이트코드의 실행

실행 엔진은 JVM이 바이트코드를 실행하는 핵심 컴포넌트입니다. 실행 엔진은 두 가지 방식으로 동작합니다.

첫 번째는 인터프리터입니다. 바이트코드를 한 줄씩 해석하며 실행하지만 속도가 느리다는 단점이 있습니다.

두 번째는 JIT(Just-In-Time) 컴파일러로, 자주 실행되는 바이트코드를 기계어로 변환하여 실행 속도를 높입니다. JIT 컴파일러는 프로그램 실행 중에도 지속적으로 성능을 분석해 최적화하는 어댑티브 최적화를 수행합니다.

 

5. 가비지 컬렉터의 역할

가비지 컬렉터(Garbage Collector)는 JVM 힙 영역에서 더 이상 참조되지 않는 객체를 자동으로 제거하여 메모리를 회수합니다. 가비지 컬렉션은 JVM이 안정적으로 동작하도록 도와주는 핵심 요소 중 하나입니다. 가비지 컬렉터는 크게 Young Generation(새롭게 생성된 객체)과 Old Generation(오랫동안 살아남은 객체)으로 메모리를 나누어 관리합니다. 이 과정에서 주로 Young Generation에 Minor GC가 자주 발생하고, 필요에 따라 Old Generation에서 Major GC가 수행됩니다.

가비지 컬렉션 알고리즘에는 Serial GC(단일 스레드로 처리), Parallel GC(다중 스레드로 병렬 처리), 그리고 G1 GC(Region 기반으로 메모리를 관리) 등이 있습니다.