| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- java
- 2026 AWS SAA-C03
- 부트스트랩 클래스 로더
- 어플리케이션 클래스 로더
- 파이썬 문자열 메서드
- 스프링
- 객체지향
- 딕셔너리
- 자료구조
- stop the world
- dfs
- 심볼릭 레퍼런스
- getreference
- 클래스 로더 계층
- 플랫폼 클래스 로더
- 알고리즘
- 다이렉트 레퍼런스
- python
- 자바
- 백준
- python list method
- 코딩테스트
- Spring
- 컴포넌트 스캔
- AWS SAA-C03 합격후기
- BFS
- 파이썬
- aws saa-c03
- 파이썬 리스트 메서드
- 스프링 컨테이너
- Today
- Total
클라우드 낚시꾼
[JAVA] JVM의 클래스 로더 알아보기 본문
클래스 로더란?

클래스 로더는 클래스 파일을(바이트 코드) 동적으로 로딩 및 링크하여 JVM의 메모리 영역에 적재하는 역할을 한다.
클래스 파일의 로딩 순서

- 로딩: 클래스 파일을(바이트 코드) 가져와 JVM의 메모리 영역에 로드한다.
- 링크: 클래스 파일을 사용하기 위해 검증하는 과정이다.
- 검증: 읽어드린 클래스 파일이 JVM 명세에 명시된 대로 구성되어 있는 지 검사한다.
- 준비: 로딩 단계에서 할당 받은 메모리를 초기화한다.
- 분석: 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환한다.
- 초기화: 정적 초기화 블록과 정적 변수를 초기화한다.
Class Loader의 특징 및 원칙
1. Delegation(위임 원칙): 부모 클래스로더 방향으로 클래스 로딩을 위임한다.
2. Visibility(가시범위 원칙): 자식 클래스 로더는 부모 클래스 로더가 로드한 Class를 찾을 수 있지만, 그 반대는 불가능하다.
3. Uniqueness(유일성 원칙): 하위 클래스로더가 상위 클래스로더에서 로드한 클래스를 다시 로드하지 않아야 한다는 원칙이다.
4. Hierarchical(계층 구조): 클래스 로더가 계층적 구조를 가지도록 생성(부모-자식의 관계)한다.
5. Lazy Lading(동적 로딩): 자바의 클래스 로더는 클래스를 필요할 때까지 로드하지 않는다. 즉, 필요할 때 로드한다.
Class Loader 계층 구조

클래스 로딩은 계층적인 구조로 이루어져 있으며, 각각의 클래스 로더가 특정한 역할을 수행한다.
- Bootstrap ClassLoader
- Platform (또는 Extension) ClassLoader
- Application (또는 System) ClassLoader
기본적으로 위 3가지 클래스 로더가 클래스 로딩의 계층 구조를 이루며, 위에서 아래로 계층적으로 작동한다.
Bootstrap ClassLoader (부트스트랩 클래스 로더)

역할
JVM의 최상위 클래스 로더이며, 자바의 핵심 클래스에 포함된 기본 자바 API 클래스들을 로딩한다. (예를 들어, java.lang.String, java.lang.Object, java.util.* 같은 핵심 클래스들이 여기에서 로딩된다.)
특징
- JVM이 시작될 때 가장 먼저 로드되는 클래스 로더이며, 다른 하위 클래스 로더들을 로드할 수 있다.
- 네이티브 코드로 구현되어 있고, 사용자가 제어할 수 없는 클래스 로더이다.
- jdk/jre/lib 디렉터리에 있는 표준 자바 API를 로드한다.
Platform ClassLoader (플랫폼 또는 확장 클래스 로더)

역할
JVM에서 특정한 플랫폼 확장 라이브러리를 로드하기 위해 사용된다.
특징
- Bootstrap ClassLoader의 하위에 위치하며, 상위 로더에서 찾을 수 없는 클래스를 로드하는 역할을 한다.
- 자바 9부터는 Platform ClassLoader라고 명칭되었으며, 이전에는 Extension ClassLoader라고 불렸다.
- 기본적으로 ${JAVA_HOME}/jre/lib/ext 내 클래스들을 로드하고, java.ext.dirs 환경변수를 통해 로드 할 디렉토리를 설정 할 수 있다.
Application ClassLoader (애플리케이션 또는 시스템 클래스 로더)

역할
사용자 애플리케이션의 클래스를 로딩하는 역할을 하는 기본 클래스 로더이다.
특징
- Platform ClassLoader의 하위에 위치한다.
- com.example.MyApp과 같은 사용자 정의 클래스는 Application ClassLoader에 의해 로딩된다.
- 사용자가 직접 제어할 수 있으며, 사용자가 지정한 ${CLASSPATH}의 클래스 파일들을 로드한다.
클래스 로딩의 위임 모델

- JVM의 메서드 영역에 클래스가 로드되어있는지 확인하고, 로드되어 있다면 해당 클래스를 사용한다. 존재하지 않는 경우 클래스 로더에 로드를 요청한다.
- 애플리케이션 클래스로더 -> 확장 클래스로더(플랫폼 클래스로더) -> 부트스트랩 클래스로더로 요청이 위임된다.
- 부트스트랩 클래스로더는 jdk/jre/lib에 해당 클래스가 있는지 확인한다. 없으면 확장 클래스로더(플랫폼 클래스로더)에 위임한다.
- 확장 클래스로더(플랫폼 클래스로더)는 jdk/jre/lib/ext에 해당 클래스가 있는지 확인하고 없으면 애플리케이션 클래스로더에 위임한다.
- 애플리케이션 클래스 로더는 환경 변수로 지정된 class path에 해당 클래스가 있는지 확인하고 존재하지 않으면 예외를 발생시킨다.
Class Path (클래스 패스) : JVM이 시스템 모든 폴더를 검사할 수 없으므로 JVM에 파일 경로를 제공해야한다.
참고 문헌
https://leeyh0216.github.io/posts/java_class_loader/
https://kingjakeu.github.io/java/2020/08/10/class-loader/
'Programming Language > JAVA' 카테고리의 다른 글
| [JAVA] STW(Stop-The-World) 문제와 발생 이유 (0) | 2024.11.13 |
|---|---|
| [JAVA] 심볼릭 레퍼런스와 다이렉트 레퍼런스 (0) | 2024.11.13 |
| [JAVA 자바] 변수의 종류와 초기화 + Null (0) | 2023.12.31 |
| [JAVA 자바] 기본형과 참조형 + Call by Value (1) | 2023.12.29 |
| [JAVA 자바] 클래스와 객체 생성 + 내부 동작 알아보기 (0) | 2023.12.29 |