1편 : https://developer-youn.tistory.com/124
3편 : https://developer-youn.tistory.com/126
4편 : https://developer-youn.tistory.com/127
0. 목표
java를 개발하다 보면 종종 class loader라는 단어를 콘솔에 찍힌 에러 등을 통해 본 적이 있을 수도 있다.(실은 대부분 봤을 확률이 높다)
그렇다면 이 클래스 로더 도대체 뭐 하는 놈이길래 에러가 나는 것일까
이 글을 통해 클래스 로더가 어떤 역할을 하는지 얕게 알아간다.
1. 클래스 로더
이름 그대로 직역을 하면 class를 load 하는 기능을 담당한다.
실은 그게 전부다.
.class 파일을 읽어서 잘 수행할 수 있게 번역하고 가공해 주는 역할을 한다고 보면 된다.
클래스 로더는 크게 3가지 단계로 기능을 진행한다.
Loading, Linking, Initializing이다.
2. Loading
말 그대로 load를 하는 단계이다.
javac를 통해 만들어진 .class파일을 최초에 읽는 역할을 한다.
그렇다면 어느 부분부터 읽어야할지 애매하겠지만 우리가 잘 알고 있는 static main 메서드부터 읽기 시작한다.
3. Linking
Loading 단계에서 읽어들인 바이트 코드에 대해 서로 연관관계(reference)가 있는 코드끼리 연결을 해준다.
이 연결을 위해 Linking은 다시 3가지 단계를 거친다.
Verifying, Preparing, Resolving
3-1. Verifying
loading과정에서 읽어들인 .class파일이 정말 명세에 맞게 잘 만들어진 파일인지 검사한다.
이 검사에는 jdk의 버전이 호환되는지에 대한 검사도 포함된다.
여기서 문제가 발생하면 verifyexception을 발생한다.
3-2. Preparing
Verifying 과정에서 검사가 끝났으면 이제 현재 코드에서 얼마큼의 메모리가 필요한지(static, class) 미리 계산하여 할당을 해준다.
3-3. Resolving
constant pool에 있는 symbolic reference를 direct reference로 변환한다.
이렇게 적으니 뭔가 좀 어려워 보이네요. 하나 하나씩 좀 풀어보자.
constant pool : 리터럴 상수를 저장하고 Class와 Method에 대한 참조 값도 담고 있는 저장 메모리
symbolic reference : 이름(symbol)로 참조
direct reference : 메모리 주소로 참조
다시 말해 메모리에서 이름으로 참조하던걸 주소로 참조할 수 있게 변환한다고 한다.
4. Initializing
클래스 변수를 초기화합니다. 이렇게 말하니 좀 어색하다.
static 이 붙은 변수들에 값을 할당한다고 표현하자.
5. 결국 클래스 로더가 하는 일은
- .class 파일을 읽는다.
- 올바른 명세인지 확인한다.
- 메모리에 올린다.
- 필요한 변수들을 초기화한다.
6. 클래스 로더의 종류
클래스 로더도 종류가 있다. 각 클래스 로더마다 읽어 들이는(load 하는) 파일이 다르다.
기본적으로 jvm의 클래스 로더는 bootstrap, extenstion, application 클래스 로더가 있다.
(여기까지만 읽어도 괜찮다. 6-1은 부록 느낌이다.)
6-1. Bootstrap 클래스 로더
- 최상위 클래스 로더
- jre/lib/rt.jar에 있는 파일 로드
- 표준 java 패키지(java.net, java.util…) 가 여기 속한다
6-2. Extenstion 클래스 로더
- jre/lib/ext 혹은 java.ext.dirs 디렉토리에 있는 파일들을 로드한다
6-3. Application 클래스 로더
- classpath에 등록된 디렉토리(기본적으로 java application이 존재하는 디렉터리)에 있는 파일들을 로드한다
6-4. 클래스 로더 만들기
custom classloader를 만들어서 application classloader에 붙일 수 있다
7. 클래스 로더 마무리
- 하위 레벨에 있는 클래스 로더는 상위 레벨에 있는 클래스 로더에 대한 값을 읽어올 수 있다.
- 클래스 로더의 loading, linking, verifying은 모든 파일을 한번에 읽고 진행하는 게 아니라 모든 파일을 계속 읽어 들이면서 진행한다고 생각하면 된다.
contact: dev.berno@gmail.com
'JAVA > java - core' 카테고리의 다른 글
throw에 대한 간단한 설명과 개인적인 생각 (0) | 2023.02.26 |
---|---|
jvm 조금씩 알아가기 4편 - 실행 엔진(Execution Engine) (0) | 2023.02.22 |
jvm 조금씩 알아가기 3편 - 데이터 영역(Runtime Data Areas) (0) | 2023.02.19 |
jvm 조금씩 알아가기 1편 - jvm이란 (0) | 2023.02.17 |