이 글에서는 클래스로더의 역할과 동작 방식을 알아보고자 합니다.
클래스로더는 .class 파일을 JVM으로 로딩시켜주는 역할 이외에도, 여러 역할을 수행합니다.
클래스로더의 동작 방식은 로딩 -> 링크 -> 초기화 순서로 동작합니다.
로딩
- 클래스 로더가 .class 파일을 읽고 적절한 바이너리 데이터를 만듭니다.
- 만든 바이너리 데이터를 "메소드" 영역에 저장합니다.
- 메소드 영역에는 아래와 같은 데이터를 저장합니다.
- FQCN (Fully Qualified Class Name) : 패키지명까지 포함된 클래스명이라고 합니다.
- 클래스, 인터페이스, 이넘(enum)
- 메소드, 변수
- 로딩이 끝나게 되면, 해당 클래스 타입의 Class 객체를 생성하고 "힙 영역"에 저장합니다.
링크
- 링크는 아래 세 단계로 나눠져 있습니다.
- Verify : .class 파일이 유효한지 체크하는 단계입니다.
- Prepare : static 변수와 기본 값에 필요한 메모리를 준비하여 할당합니다. (메모리 준비 과정)
- Resolve(Optional) : SymbolicMemoryReference를 실제 레퍼런스로 교체합니다.
- Resolve 추가 설명
- 아래의 참조는, 링크 과정에서는 "Symbolic reference"형태로 관리됩니다.
- 이는 논리적 레퍼런스로, 실제 레퍼런스를 갖고있지 않은 상태를 의미합니다.
- Resolve 과정을 거치면 Symbolic reference는 실제 레퍼런스로 교체됩니다.
- 하지만, 이는 Optional 과정으로, 링크 과정에서 교체될 수도 있고, 이후의 과정에서 교체될 수도 있습니다.
SymbolicReference symbolicReference = new SymbolicReference();
초기화
- static 변수의 값을 할당합니다.
- static 블럭이 있을 경우, 이 때 실행됩니다.
출처
https://www.inflearn.com/course/the-java-code-manipulation/dashboard
'Java' 카테고리의 다른 글
자바 클래스 초기화 탐구 (0) | 2023.01.13 |
---|---|
Java의 상속과 생성자 (0) | 2022.10.21 |
JVM(Java Virtual Machine)의 구조 (0) | 2022.10.20 |
JVM, JDK, JRE의 차이점 (0) | 2022.10.20 |
댓글