TIL

TIL 3일차

Choony 2025. 1. 23. 23:14

그 기간이 왔다. 작심삼일. 

 

난 이 기간을 견뎌내고 내일도 쓸것이다 ㅋ


오늘의 수업을 통해 드디어 JDK에 대해서 배우게 되었는데 JDK 속의 JRE, 특히 JVM을 열심히 공부해봤다.


JVM의 핵심 구성 요소와 원리

 

1. Class Loader: 클래스 로딩의 시작점

Class Loader는 JVM으로 **바이트 코드(.class 파일)**를 가져와 실행할 준비를 합니다. 이 과정에서 **동적 로딩(Dynamic Loading)**이 이루어지며, 아래와 같은 3단계를 거칩니다.

 

(1) 로딩(Loading)

.class 파일을 찾아 메모리에 로드합니다.

 

(2) 링크(Linking)

검증(Verifying): 바이트 코드가 JVM 명세에 맞는지 확인.

준비(Preparing): 클래스가 필요로 하는 메모리를 할당.

해석(Resolving): 클래스 내 모든 **심볼릭 레퍼런스(Symbolic Reference)**를 **다이렉트 레퍼런스(Direct Reference)**로 변경.

 

심볼릭 레퍼런스란?

이름, 경로 등 문자열로 참조하는 방식.

예: java/lang/String 또는 메서드 이름으로 특정 메서드 참조.

 

다이렉트 레퍼런스란?

실제 메모리 주소나 런타임에 접근 가능한 참조.

예: JVM이 System.out.println을 호출할 때, 해당 메서드와 필드가 메모리 주소로 저장되어 빠르게 접근 가능.

 

(3) 초기화(Initialization)

로드된 클래스의 정적 변수나 초기화 블록 실행.


2. Garbage Collector: 메모리 관리의 핵심

 

JVM은 **GC(Garbage Collector)**를 통해 사용되지 않는 객체를 자동으로 제거합니다. 아래는 GC의 주요 원리입니다.

 

(1) 도달 가능성 분석 (Reachability Analysis)

GC Root를 기준으로 객체가 도달 가능(Reachable) 한지 판단.

도달 가능한 객체는 Alive 상태로 간주, 그렇지 않은 객체는 제거 대상.

 

GC Root의 예

JVM 스택의 지역 변수와 메서드 호출 스택.

메서드 영역(Method Area)의 정적 변수(static).

네이티브 메서드에서 참조하는 객체.

 

(2) 세대별 GC (Generational GC)

 

객체를 생존 시간에 따라 분리하여 관리.

Young Generation: 새로 생성된 객체 관리. 대부분 금방 소멸.

Old Generation: Young Generation에서 오래 살아남은 객체 관리.

Permanent Generation/Metaspace: 클래스 메타데이터 관리 (JDK 8부터 Metaspace로 변경).

 

세대별 GC의 장점

관리 범위를 좁혀 GC의 빈도와 비용 감소.

도달 가능성 분석으로 정확한 객체 제거.


3. Execution Engine: 실행의 중심

Execution Engine은 JVM의 바이트 코드를 플랫폼 독립적으로 실행합니다.

 

주요 구성 요소

1. 인터프리터(Interpreter): 바이트 코드를 한 줄씩 해석하여 실행.

2. JIT(Just-In-Time) 컴파일러: 반복 실행되는 코드를 네이티브 코드로 컴파일하여 성능 향상.

3. 가비지 컬렉터(Garbage Collector): 메모리 관리 및 최적화.