java.lang.ClassLoader
A class loader is an object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system.
클래스 로더는 클래스들을 로딩하는 객체다. ClassLoader 클래스는 추상클래스다. 어떤 클래스의 바이너리 이름이 주어지면 클래스 로더는 해당 클래스의 정의를 구성하는 데이터를 찾거나 생성하기 위해 시도해야 한다. 이를 위한 전형적인 전략은 바이너리 이름을 파일 이름으로 변환한 뒤, 파일 시스템의 해당 경로로부터 "클래스 파일"을 읽는 것이다.
ClassLoader 클래스는 자바 애플리케이션을 실행 중에 JVM의 메모리에 Class를 올리기 위해 사용된다. 자바는 애플리케이션을 실행할 때 필요한 모든 클래스를 미리 JVM 메모리에 로드하는 것이 아니라, 필수적인 클래스들만 먼저 로딩한 뒤(JVM start-up)에 실행 과정에서 실제로 참조되는 클래스를 동적으로 로드(lazy-loading)한다. 이는 메모리를 효율적으로 사용하며 실행 시간을 단축하는 데 도움을 준다.
클래스 로더 위임 모델 (Class Loader Delegation Model)
JVM은 기본적으로 다음과 같은 세 개의 내장 클래스 로더
- Bootstrap ClassLoader (native)
Extension ClassLoader→ Platform ClassLoader (Java 9 ~)Application ClassLoader→ System ClassLoader (Java 9 ~)
를 가진다. 위의 그림은 Java 8까지의 모습이며 Jigsaw프로젝트를 통해 Java 9부터는 이름과 역할이 조금씩 변경되었다. 참고로 Jigsaw 프로젝트는 기존의 JDK를 재구성하고 소스 코드를 더 작은 단위들로 모듈화하는 프로젝트다. 이러한 큰 변화 속에서 ClassLoader가 영향 받은 점은 위의 그림처럼 Bootstrap ClassLoader가 실행을 위한 라이브러리 모음인 rt.jar (rt : runtime)를 로딩하던 것에서, $JAVA_HOME/lib/modules라는 확장자가 없는 jimage파일 안에서 java.base 모듈을 포함한 기본 모듈 일부만을 로딩하도록 바뀐 것이다.
변하지 않은 점은 ClassLoader가 계층적 구조라는 점인데, 이를 이해하기 위해 위의 그림을 살펴보아야 한다. 그 전에 저 그림 직전의 상황, 즉 자바 애플리케이션이 처음 실행되고 우리가 만든 클래스의 로딩이 일어나기 전까지의 과정부터 먼저 간단하게 살펴보자.
처음 JVM 프로세스가 실행되면 main() 메서드를 찾는다. main() 메서드를 찾으면 이를 실행하기 위한 메인 스레드가 생성되고 메인 스레드에 의해 Bootstrap ClassLoader의 초기화 과정이 일어나며, 이 초기화 과정 속에서 기본 Java 클래스와 모듈(java.base 등)을 로드하는 초기 로딩이 실행된다. 자바 애플리케이션이 이 기본 모듈을 이용해 main() 메서드를 실행시키다가 새로운 클래스를 로딩해야 할 시점이 오면 비로소 위의 그림처럼 클래스 로딩이 발생한다.
클래스 로딩은 세 개의 내장 클래스 로더에 의해 순차적으로 동작하는데, 다음과 같다.
- 클래스를 로드할 필요가 있으면 JVM의 클래스 로더가 System ClassLoader에게 클래스 로딩을 요청한다.
- System ClassLoader는 다시 Platform ClassLoader에게 클래스 로딩을 위임한다.
- Platform ClassLoader는 다시 Bootstrap ClassLoader에게 클래스 로딩을 위임한다.
- Bootstrap ClassLoader는 로딩해야 할 클래스가 자신의 관심사, 즉 modules파일 안에 있으면 로드한다.
- Platform ClassLoader는 로딩해야 할 클래스가 자신의 관심사 안에 있으면 로드한다.
- System ClassLoader는 로딩해야 할 클래스가 자신의 관심사 안에 있으면 로드한다.
- 클래스 로더들이 로딩해야 할 클래스를 찾지 못했다면 ClassNotFoundException 예외가 발생한다.
이렇게 클래스 로더가 계층 구조로 이루어져 있으며, 부모 클래스에게 역할을 위임(Delagation)하고 자신의 관심사만을 처리하는 모델을 클래스 로더 위임 모델(Class Loader Delegation Model)이라고 한다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java DB] 1. JDBC - Java와 DB 상호작용의 기초 (0) | 2024.06.10 |
---|---|
[Java] JDK 부수기 - (3) java.lang.Math (0) | 2023.12.20 |
[Java] JDK 부수기 - (3) java.lang.Class (0) | 2023.12.04 |
[Java] JDK 부수기 - (2) java.lang.System - 5. currentTimeMillis, nanoTime (0) | 2023.11.29 |
[Java] JDK 부수기 - (2) java.lang.System - 4. getProperties (0) | 2023.11.28 |