본문 바로가기
코딩일기/Java

[Java] ClassLoader 구조 및 동작 원리

by 욱파이어니어 2022. 10. 14.
728x90
반응형

이전에 JVM에 대해서 자세히 설명한적이 있다 거기서 ClassLoader라는 개념이 나오는데 이번에는 

ClassLoader에 대한 자세한 설명을 하려고 한다.

 

 

 

Class Loader

 

Class Loader는 ByteCode를 읽어서 Class 객체를 생성하는 역할을 한다.

 

Class Loader의 특징은 크게 5가지이다.

 

 

 

1. 계층구조

2. 위임모델

3. 가시성 제한

4. 언로드 불가

5. 이름 공간(Name Space)

 

 

 

이제 이 5가지에 대해서 자세히 알아보자.

 

 

1. 계층구조

 

Class Loader 는 단순하게 클래스 로더 하나로만 이루어져있지 않다.

 

아래 사진과 같이 계층 구조로 Class Loader 가 이루어져 있다.

 

 

각각 계층에 대해서 자세히 알아보자

 

 

Bootstrap Class Loader

Bootstrap Class Loader는 최상위 클래스 로더로 유일하게 Java가 아닌 네이티브 코드로 구현이 되어 있다.

(여기서 네이티브 코드란 CPU와 운영체제가 직접 실행할수 있는 코드를 뜻한다.)

Bootstrap Class Loader 에서는 JVM이 실행될때 같이 메모리에 올라간다. 그리고 Object 클래스를 비롯하여

Java API들을 로드한다.

 

 

 

Extenstion Class Loader

기본 Java API를 제외한 확장 클래스들을 로드한다. ( 다양한 보안 확장 기능 로드)

 

 

 

System Class Loader

Bootstrap 과 Extension이 JVM 자체의 구성요소를 로드한다면 System Class Loader는 애플리케이션의 클래스들을 로드한다(개발자가 만든 클래스). 따라서 사용자가 지정한 ClassPath 내의 클래스들을 로드한다.

 

 

User-Defined Class Loader

어플리케이션 사용자가 직접 코드상에서 생성한 Class Loader

 

 

 

2. 위임 모델

위임 모델은 특정 클래스를 찾기 위해서 아래와 같이 명령한다.

 

 

SystemClassLoader부터 Class Load 하라는 실행을 Bootstrap까지 위임한다음 Bootstrap에서 찾으면 

클래스를 보내주고 아니면 ExtenstionClassLoader 여기서 찾으면 보내주고 없으면 SystemClassLoader로 넘겨주고 여기서도 없으면 ClassNotFoundException 에러가 나오는것이다.

 

 

3. 가시성 제한

 

가시성 제한은 위임에서 보면 하위 클래스 로더는 상위 클래스 로더의 클래스를 확인할수 있지만 상위 클래스 로더는 하위 클래스 로더가 로딩한 클래스를 확인해볼수 없는것이 가시성 제한다.

 

 

 

 

4. 언로드 불가

 

이건 클래스 로드하는것은 가능하지만 클래스를 Unload하는것은 불가하다는것이다.

 

 

 

5. 이름 공간 (NameSpace)

 

 

NameSpace에 보관된 클래스를 기준으로 클래스를 찾아보고 없으면  위임 을 통해서 클래스를 로드한다.

따라서 이것은 하위 클래스 로더가 상위 클래스 로더가 로딩한 클래스를 다시 로딩하지 않는것을 보장한다는것이다.

 

 

Class Loader의 특징을 알았으니 이제 Class Loader가 클래스를 로드하는 과정에 대해서 알아보자.

 

 

 

 

 

 

 

ClassLoader가 클래스 로드하는 과정

 

 

 

 

Class Loader가 클래스를 로드하는 과정은 위 사진과 같다 위사진에 있는 큰 개념인

Loading, Verifying, Preparing, Resolving, Initialising 에 대해서 자세히 알아보자.

 

 

 

Loading

클래스 파일을 가져와서 JVM의 메모리에 로드한다.

 

Verifying

클래스 로드 전과정에서 가장 복잡하고 시간이 많이 걸리는 과정으로 읽어들인 클래스 파일이 자바 언어 명세 및 JVM 명세에 맞게 구성되어 있는지 검사하는 부분이다.

 

Preparing

클래스가 필요하는 메모리를 할당한다. 여기서 필요한 메모리란 클래스에서 정의된 메소드, 인터페이스 들을 나타내는

구조들 등등을 말한다.

 

Resolving 

클래스의 상수풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.

여기서 심볼릭 레퍼런스란 참조하고자 하는 대상의 이름만으로 참조관계 구성이고

다이렉트 레퍼런스는 이름에 맞는 객체의 주소를 찾아서 연결하는것을 뜻한다.

 

 

Initialising

클래스 변수들을 적절한 값으로 초기화 한다.

 

 

 

 

 

이런 일련의 과정을 거쳐서 Byte코드를 읽어 들여서 Class 객체를 생성하고 메모리를 할당하게 된다.

 

 

 

반응형