1. ClassLoader 개요
- ClassLoader는 JVM(Java Virtual Machine)의 핵심 컴포넌트로, 자바 바이트코드(.class 파일)를 JVM의 메모리에 동적으로 로드하는 역할을 담당합니다.
- 자바는 '동적 로드' 방식을 사용하는데, 이는 컴파일 시점이 아닌 런타임에 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 방식입니다.
- ClassLoader 덕분에 Java 런타임은 파일 시스템의 구조나 형식에 독립적으로 동작할 수 있습니다.
정보
동적 로딩의 장점:
- 메모리 효율성: 필요한 클래스만 메모리에 로드
- 유연성: 런타임에 클래스를 교체하거나 수정 가능
- 모듈화: 플러그인이나 확장 기능을 쉽게 구현 가능
2. ClassLoader의 계층 구조
- ClassLoader는 계층적인 구조를 가지며, 각 계층은 특정 영역의 클래스 로딩을 담당합니다.
2.1 Bootstrap ClassLoader (Primordial ClassLoader)
- JVM의 핵심 컴포넌트를 로드하는 최상위 클래스 로더입 니다.
- 자바 8까지는
rt.jar에서, 자바 9부터는 Java Runtime Image(JRT)에서 코어 자바 파일을 로드합니다. - 다른 클래스 로더와 달리 네이티브 코드로 구현되어 있습니다.
<JAVA_HOME>/jre/lib디렉터리의 핵심 자바 클래스들을 로드합니다.
2.2 Platform ClassLoader (Extension ClassLoader)
- Java 9부터 Extension ClassLoader가 Platform ClassLoader로 변경되었습니다.
- JDK의 모듈 시스템에서 플랫폼 관련 확장을 로드합니다.
java.platform시스템 속성이나--module-path옵션으로 지정된 모듈을 로드합니다.<JAVA_HOME>/jre/lib/ext디렉터리의 클래스들을 로드합니다.
2.3 System ClassLoader (Application ClassLoader)
- 애플리케이션의 클래스패스에 있는 클래스들을 로드합니다.
- Platform ClassLoader의 자식 클래스 로더입니다.
- 다음 위치에서 클래스를 로드합니다:
- CLASSPATH 환경 변수
- -classpath 또는 -cp 커맨드라인 옵션
- 애플리케이션의 클래스패스