Class Loader 는 JVM 내로 Class 를 load 하고 Link 를 통해 적절히 배치하는 작업을 하는 모듈이다.
이름을 통해 class 를 구별한다.
loader name + package name + class name 모두가 일치하는지를 확인.
class loader 간에는 부모-자식이 존재한다
class 가 필요할 시, 부모에게 load 를 위임한다.
이때, 부모로만 위임 요청이 가능하며, 자식 또는 이웃에게는 요청 및 탐색이 불가능 하다.
.class 형태의 바이너리 파일을 획득
파일 시스템 뿐만 아니라 네트워크 등의 다양한 환경을 통해 획득이 가능하다.
class 를 method area에 적재가 가능하도록 분석을 하는 작업
class 는 결국 method area에 refenrence 형태로 적재가 되니, class 의 meta 정보를 생성
java.lang.class 인스턴스를 생성하는 작업.
안에 기본적인 class 가 담겨있음.
Class 가 문법에 어긋남이 없는지, 전개상 정합성에 문제가 없는지 판단.
문법에 오류가 있으면 바이트 코드로 컴파일이 안 되는데요?
자세한건 VerifyError 를 참고하면 좋다.
가장 흔한 경우는 상위버전으로 컴파일을 한 .class 파일을 하위버전의 jdk 로 구동시키는 경우 발생한다.
Type 별로 메모리를 할당 및 default 값을 설정
Type | Default |
---|---|
int | 0 |
long | 0L |
short | (short)0 |
char | '\u0000' |
byte | (byte)0 |
reference | null |
float | 0.0f |
double | 0.0d |
Symbolic Reference 를 Direct Reference 로 변경
변수들을 적절한 값으로 초기화
rt.jar 와 같은 큰 파일들을 미리 load 해놓아 jvm 의 기동 시간을 줄이거나 메모리를 절약하는 등의 효과를 누릴 수 있다.
java 9버전 부터는 구조가 jdk 구조가 바뀌었다.
이에따라 class loader 의 역할또한 바뀌게 되었다.
rt.jar 파일이 사라져, rt.jar 가 아닌 "java.base" 기반의 api 만 호출
JavaSE 내의 클래스들을 탐색
$CLASS_PATH 뿐 아니라 $MODULE_PATH 또한 호출. 탐색범위 증가.