클래스 로더란?
자바는 메모리를 효율적으로 관리하기 위해 모든 클래스를 한 번에 로딩하는 것이 아닌 필요할 때만 지연 로딩하는 방식을 사용한다. 이 동작을 가능하게 해 주는 것이 클래스 로더이다.
로드(loading)
- 자바 바이트코드(.class)를 메소드 영역 다음과 같은 정보를 저장한다.
- 로드된 클래스와 그 부모 클래스
- 어떤 타입으로 선언됐는지 ex) class, interface, enum
- 변수나 메서드 정보
링크(Linking)
- 검증 : 로드된 클래스가 JVM 명세에 맞는지(오버/언더플로우, 올바른 명령어 등)를 검사한다.
- 준비 : static 필드들의 메모리를 슬롯을 할당하고 기본값으로 초기화한다.
- 분석 : 클래스에 심볼릭 참조(이름 기반 참조)를 직접 참조(메모리 주소)로 바꾼다.
초기화(Initialization)
- 클래스 로딩과 링크가 끝난 뒤, 실제로 값을 초기화한다.
클래스 로더 종류
부트스트랩 클래스 로더(Bootstrap Class Loader)
- 최상위 클래스 로더이며 최소한의 자바 클래스를 로드한다.
확장 클래스 로더(Extension Class Loader)
- Bootstrap 로더의 자식으로, JRE 설치 경로의 lib/ext/ (또는 java.ext.dirs) 디렉토리에 놓인 확장 JAR들을 로드합니다.
애플리케이션 클래스 로더(Application Class Loader)
- 자바 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스들을 로드합니다.
- 일반적으로 개발자가 작성한 .class 확장자 파일이 이에 해당한다
- System Class Loader라고도 부른다.
클래스 로더의 3가지 원칙
위임원칙(Delegation Priciple)
- 클래스 로딩 요청을 받으면 부모 클래스 로더에게 로드를 위임하고 최상위 클래스로더(Bootstrap)에서 부터 찾기 시작하여 찾지못하면 찾을 때 까지 자식에게로 계속 내려간다.
- 이를 중복 로드를 하지않고 일관성을 확보한다.
가시성 원칙(Visibility Priciple)
- 하위 클래스 로더는 상위 클래스 로더가 로딩한 클래스를 볼 수 있지만, 반대로 상위로더는 하위 로더가 로딩한 클래스를 볼 수 없다.
- 이로써 시스템 전반의 클래스 충돌을 방지하고, 모듈화된 구조를 유지할 수 있다.
유일성 원칙(Uniqueness Principle)
- 동일한 이름의 클래스를, 부모가 이미 로드했다면 자식 로더는 다시 로드하지 않는다
- 위임 원칙 덕분에 애플리케이션 전역에서 클래스의 중복없는 로드를 보장한다.