자바
자바 JVM - 클래스 로더
개발자 포비
2024. 11. 23. 23:01
클래스 로더 개요
클래스 로더는 자바 프로그램에서 핵심적인 역할을 하며, 자바 바이트 코드를 정의하고 메모리에 로딩하는 기능을 수행합니다. 클래스 로더에 대한 깊은 이해는 자바 프로그래밍을 효과적으로 하는 데 필수적입니다.
클래스 로더의 역할
- 특정 클래스에 대한 정의(Byte Stream)를 가져와 메모리에 로딩합니다.
- 클래스 로더는 자바 바이트코드를 처리하여 JVM이 실행할 수 있도록 합니다.
클래스 로더의 종류
- 부트스트랩 클래스 로더: JVM이 시작될 때 기본 라이브러리를 로딩합니다.
- 플랫폼 클래스 로더: 확장된 클래스 로딩을 담당합니다.
- 애플리케이션 클래스 로더: 사용자 정의 클래스를 로딩합니다.
자바 클래스 로딩 과정
- 컴파일: 텍스트 형태의 Java 파일이 컴파일되어 클래스 파일(.class)로 변환됩니다.
- 링킹: 런타임에 필요한 경우 다음 과정을 거칩니다.
- 검증(Verification): 클래스 파일의 형식과 규격을 검증합니다.
- 준비(Preparation): 메모리 공간을 확보하고 초기값을 설정합니다.
- 해석(Resolution): 심벌 참조를 실제 참조로 변경합니다.
링킹 과정은 런타임에 이루어지며, 이로 인해 높은 확장성과 유연성을 제공합니다. 또한, 클래스 로더는 네트워크를 통해 프로그램 코드를 수신할 수 있는 기능도 갖추고 있습니다.
클래스 검증
클래스 검증은 JVM 명세가 정하는 규칙과 제약을 충족하는지 확인하는 과정입니다. 검증 항목은 다음과 같습니다:
- 파일 형식 (.class)
- 메타데이터
- 바이트코드
- 심벌 참조 (존립 의존적 관계에 대한 정보 포함)
바이트 코드 검증 시, 보안 위협에 대한 검증도 포함됩니다.
준비 및 해석
- 객체 인스턴스가 저장될 메모리 공간을 확보하고 0으로 초기화합니다. 이 과정은 JVM에서 자동으로 처리됩니다.
- 생성자 호출 전 상태에서 필드의 초기값은 생성자 호출 시 변경됩니다.
- 해석 과정에서는 상수 풀의 심벌 참조를 실제 참조로 변경하여 바인딩합니다.
Heap 영역에 객체 생성
- JVM은 객체 저장을 위한 메모리 공간을 확보한 후, 해당 공간을 0으로 초기화합니다. (헤더를 제외)
- 객체 초기화를 위한 구성 설정은 다음과 같습니다:
- 클래스 이름 및 메타 정보 확인
- 객체에 대한 해시코드
- GC 세대 나이
모든 준비가 마친 후 생성자가 호출되어 객체가 완전히 초기화됩니다.
가비지 컬렉션과 언로딩
- 클래스 인스턴스가 더 이상 필요하지 않을 때 언로딩이 발생하며, 이는 가비지 컬렉터(GC)에 의해 관리됩니다.
- 사용되지 않는 클래스 인스턴스는 GC에 의해 메모리에서 제거됩니다.
결론
클래스 로더는 자바 프로그램의 핵심 구성 요소로, 클래스 검증, 링킹, 초기화 과정을 통해 프로그램의 안정성과 안전성을 보장합니다. 클래스 로더에 대한 이해는 자바 프로그래밍의 기초를 다지는 데 필수적입니다.
https://www.youtube.com/watch?v=ObfcjbW-CM4