JAVA ClassLoader란?
- JVM의 구성 요소 중 하나로, 클래스가 요청될 때, '.class' 파일로부터 바이트 코드를 읽어 들여 class 객체를 생성하고 메모리로 로딩하는 역할을 한다. 즉, 각 directory에 흩어진 class 파일들을 찾아서 JVM 메모리에 탑재해주는 역할을 한다.
ClassLoader가 class 파일을 로드하는 단계는 크게 3가지 단계로 나뉜다.
1. Loading - 클래스 파일을 탑재하는 과정 2. Linking - 클래스 파일을 사용하기 위해 검증 및 기본값으로 초기화하는 과정 3. Initializing - static field의 값들을 정의한 값으로 초기화하는 과정 |
============================================================================
1. Loading
- ClassLoader가 필요한 class 파일들을 찾고 탑재하는 역할을 한다.
- 내용에 따라 적절한 binary 데이터를 만들고 method 영역에 저장한다.
- JVM 스펙 및 Java Version을 확인하게 된다.
# Loading은 3가지 수준으로 나뉜다.
1. Bootstrap Class Loader : rt.jar
- rt.jar를 포함하여, JVM을 구동시키기 위한 가장 필수 library를 JVM에 탑재. 최상위 ClassLoader
2. Extension Class Loader : lib / ext
- localedata, zipfs 등 다른 표준 핵심 Java Class의 library를 JVM에 탑재함. (${JAVA_HOME}/jre/lib/ext_)
3. Application Class Loader : Class Path
- classpath에 있는 class들을 탑재함. 개발자들이 JAVA 코드로 짠 class 파일들이 이 과정을 통해서 JVM에 탑재됨.
verbose 명령어를 사용하여 탑재 과정을 추적할 수 있다.
Bootstrap에 해당되는 rt.jar 부터 탑재되는 것을 확인할 수 있다.
============================================================================
2. Linking
- loading 단계에서 생성된 binary data를 JVM의 runtime data로 합치는 과정
- 즉 loading에서 load된 class 파일들을 검증하고, 사용할 수 있게 준비하는 과정
# Linking은 3가지 수준으로 나뉜다.
1. Verifying
- JVM에서 사용이 가능한 형태인지 검증하는 작업
- JVM의 구동 조건대로 구현되지 않을 경우 VerifyError
- .class 파일의 정확성 보장
- 파일이 적절한 format인지, 유효한 compiler에 의해 생성되었는지 확인
2. Preparing
- class의 static 변수와 기본 값에 필요한 memory 공간을 준비 및 기본 값으로 초기화
- static field을 기본값으로 초기화하면, 이후 Initialization 과정에서 코드에 작성한 값으로 변경됨
3. Resolving
- 선택적으로 진행되는 과정이며, 환경에 따라 동작 유무가 결정됨
- symbolic memory reference를 메소드 영역에 있는 heap memory 영역에 있는 instance에 대한 reference로 교체
============================================================================
3. Initializing
- static 변수의 값을 할당
- SuperClass 초기화 및 해당 class의 초기화를 진행
- Linking의 preparing 단계에서 확보한 memory 영역에 static 값을 할당
'JAVA > JAVA' 카테고리의 다른 글
GC 종류 (0) | 2022.05.30 |
---|---|
AlwaysPreTouch JVM option (0) | 2022.05.18 |
Thread dump (0) | 2022.03.25 |
Virtual Host (0) | 2022.03.15 |
JVM memory 구조 (0) | 2022.02.28 |