kiwi

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

키위먹고싶다

활동하기