Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Execution Engine
- Runtime data Area
- 단일 책임 원칙
- 객체지향 설계 5원칙
- JVM
- Native Method Stack
- Heap
- Class Loader
- 자바
- stack메모리
- Data Structure
- Java
- CS
- pc register
- Single Responsibillity Principle
- Stack
- 스택
- 개방-폐쇄 원칙
- 자바 heap
- Spring SOLID
- Spring
- 스택메모리
- Open Closed Principle
- 실행 엔진
- 자료구조
- solid
- 개방폐쇄원칙
- 의존성 역전 원칙
- 단일책임원칙
- 객체지향
Archives
- Today
- Total
Juuunew 살아남기
[JAVA] JVM 02 - 클래스 로더 (Class Loader) 본문
클래스 로더는 JVM 내로 컴파일된 자바 코드(.class)를 동적으로 로드하고, 링크를 통해 레퍼런스를 연결하는 과정을 거치고 static 값들 초기화 및 변수에 할당 후 JVM의 메모리 영역인 Runtime Data Area에 배치한다.
클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우에 동적으로 메모리에 적재한다.
클래스 로더는 3단계로 진행된다.
로딩 -> 링크 -> 초기화
- 로딩 (Loading) : 자바 바이트 코드( .class )를 메소드 영역에 저장한다. 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙(Heap)" 영역에 저장.
- Bootstrap : JAVA_HOME/lib에 있는 코어 자바 API를 제공한다. (최상위 우선순위를 가진 클래스 로더)
- 확장 (Extension) || 플랫폼 클래스 로더 : 부트스트랩 클래스 로더를 부모로 갖는 클래스 로더로서, 확장 자바 클래스들을 로드한다. JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
- Application : Application 클래스 패스(어플리케이션을 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
- 링크 (Linking)
- 검증 (Verifying) : 읽어들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사
- 준비 (Preparing) : 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비
- 분석 (Resolving) : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
- 초기화 (Initialization) : 클래스 변수들을 적절한 값으로 초기화 ( static 필드들이 설정된 값으로 초기화 )
클래스 로더의 원칙 세가지
- 유일성 원칙
- 위임 계층 원칙
- 가시범위 원칙
유일성 원칙
하위 클래스 로더가 상위 클래스 로더에서 로드한 클래스를 다시 로드하지 않아야 한다는 원칙.
이 원칙이 지켜지지 않는다면 JVM에 동일한 클래스가 2개 이상 로드되는 상황이 발생.
위임 원칙
클래스 로딩이 필요한 경우 부모 클래스 로더 방향으로 클래스 로딩을 위임하는 것.
- JVM의 Method Area에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.
- Method Area에 클래스가 로드되어 있지 않을 경우, 애플리케이션 클래스로더에 클래스 로드를 요청한다.
- 애플리케이션 클래스로더는 확장 클래스로더에 클래스 로드를 요청한다.
- 확장 클래스로더는 부트스트랩 클래스로더에 클래스 로드를 요청한다.
- 부트스트랩 클래스로더는 부트스트랩 Classpath(JDK/JRE/LIB)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 확장 클래스로더가 요청을 수행하도록 한다.
- 확장 클래스로더는 확장 Classpath(JDK/JRE/LIB/EXT)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 애플리케이션 클래스로더가 요청을 수행하도록 한다.
- 애플리케이션 클래스로더는 애플리케이션 Classpath에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 ClassNotFoundException을 발생시킨다.
가시범위 원칙
하위 클래스 로더는 상위 클래스로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없다.
💡 공부 중 정리하는 내용이므로 부족한 부분이 있을 수 있습니다.
💡 참고자료
더 자바, 코드를 조작하는 다양한 방법 (인프런) - 백기선
'Language > JAVA' 카테고리의 다른 글
[JAVA] JVM 04 - 메모리 영역 (Runtime Data Area) (0) | 2023.01.28 |
---|---|
[JAVA] JVM 03 - 실행 엔진 (Execution Engine) (0) | 2023.01.12 |
[JAVA] JVM 01 - JVM이란? / JVM의 구조 (0) | 2023.01.10 |
[JAVA] 메모리 - Heap (0) | 2023.01.02 |
[JAVA] 메모리 - Stack (2) | 2022.12.27 |