TIL 3일차
그 기간이 왔다. 작심삼일.
난 이 기간을 견뎌내고 내일도 쓸것이다 ㅋ
오늘의 수업을 통해 드디어 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): 메모리 관리 및 최적화.