JVM 클래스로더
by 키위먹고싶다
자바의 동적 클래스 로딩은 클래스로더로부터 이루어진다. 컴파일 타임이 아닌 클래스를 처음 참조하는 런타임을 할 때 클래스파일을 로딩, 연결, 초기화 하는 작업이 이루어진다. 자바 컴파일러를 통해서 .class확장자를 가진 클래스 파일은 각 디렉터리에 흩어져있으며 기본적인 라이브러리 클래스 파일들은 $JAVAHOME_ 내부에 존재한다. 각각의 클래스 파일을 찾아서 JVM메모리에 탑재해주는 역할이 클래스 로더이다. 클래스로더는 로딩, 링킹, 초기화 3가지 과정을 수행한다.
1. Loading
- BootStrap ClassLoader : 모든 자바 클래스는 java.lang.ClassLoader에 의해 로드된다. 그 중 Object나 String과 같은 최상위 클래스들을 로딩한다. (기본 자바 API)NativeCode로 구현되어 있으며, 운영체제 별 구현이 다르다. JAVA_HOME/jre/lib 디렉토리에 존재하는 핵심 java API들을 로드한다.
- Extenstion ClassLoader : 부트스트랩 클래스 로더의 자식이다. JAVA_HOME/jre/lib/ext 또는 java.ext.dirs 시스템 속성으로 명시된 다른 특정 디렉토리인 확장 디렉토리 안에 존재하는 클래스들을 로드한다.(기본 자바 API를 제외한 확장 클래스)
- Application ClassLoader : System ClassLoader라고도하며 확장클래스로더의 자식이다. 애플리케이션 레벨에 속한 클래스를 로드한다 -classpath에 속한 클래스가 해당된다.
세가지 클래스가 차례대로 위임-계층하는데 차례대로 클래스파일을 찾는다. 각각의 ClassLoader들을 거쳤는데도 클래스 파일을 찾지 못하면 ClassNotFoundEeception이 발생한다.
한번 JVM에 탑재된 클래스 파일을 종료될때까지 JVM에서 제거되지 않는다.
2. Linking
로드된 클래스파일을 검증하고 사용할 수 있게 준비하는 3가지 과정
- 검증 (verify) : 읽어들인 클래스가 자바 언어 명세 및 JVM명세에 명시된 대로 잘 구성되어 있는지 아닌지에 대해 검증하며 검증이 실패할 경우 검증 오류를 내보낸다. (Java Language규칙을 준수하는지 확인)
- 준비 (prepare) : 클래스의 static변수와 기본값에 필요한 메모리 공간을 준비한다. 그리고 변수 타입에 따라 기본값으로 초기화한다.
- 해석 (resolve) : Symbolic Reference값을 Direct Reference라는 메모리 주소 값으로 바꿔준다. (new, instanceOf)
* Symbolic Reference : 참조하는 대상의 이름만 지정.
3. Initialization
클래스파일의 코드를 읽게 된다. 자바코드에서 클래스와 인터페이스의 값들을 지정한 값으로 초기화 시킨다.
'java' 카테고리의 다른 글
자바의 메모리 구조 (0) | 2022.04.08 |
---|---|
가비지컬렉터(Garbage Collector) (0) | 2022.02.05 |
자바의 실행과정(JVM,JIT) (1) | 2022.01.15 |
stream에 대한 정리 (0) | 2021.12.22 |
익명객체와 함수형인터페이스 '람다식' (0) | 2021.12.16 |
블로그의 정보
kiwi
키위먹고싶다