클래스 로더란?

컴파일된 바이트 코드, .class 파일 읽어

class 객체를 생성하여 메모리에 적재하는 역할을 담당하는 객체

아래에서 소개하는 내용은 내장 클래스 로더 위주로 알아보았다.

클래스 로더 구조

structure.png

클래스 로더는 계층 구조로 이뤄져 있으며, 기본적으로 세가지 클래스 로더가 제공된다.

  • 부트 스트랩 클래스 로더
    Bootstrap ClassLoader
    JAVA_HOME\lib에 있는 코어 자바 API를 제공
    최상위 우선순위를 가진 클래스 로더
  • 익스텐션 클래스로더
    Extension ClassLoader
    JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs
    시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
  • 애플리케이션 클래스로더
    Application ClassLoader
    애플리케이션 클래스패스에서 클래스를 읽는다.
    (애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)

아래는 서버 응용 프로그램의 클래스 로더 구조에 대한 예시이다.

classloader-structure.png

After Java 9

Java 9 부터 모듈 시스템 도입에 맞춰 기본 클래스 로더의 이름과 구현 내용등이 바뀌었는데

자세한 내용은 링크를 확인하도록 하자
클래스로더의 전반적인 설명과 원칙 그리고 자바 9 이후 변경점 등을 자세히 설명해주고 있다.

클래스 로더의 진행 순서

자바 응용 프로그램의 실행시, 클래스 로더의 구성 요소별 작동 방식에 대해 알아보자

classloader.png

클래스 로더는 크게 로딩, 링크, 초기화 순으로 진행된다.

로딩

클래스 로더가 .class 파일을 읽고
그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역에 저장.

  • 이때 메소드 영역에 저장하는 데이터
    • Fully Qualified Class Name
      클래스가 속한 패키지 명을 모두 포함한 이름
    • class | interface | enum
    • 메소드와 변수
  • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 영역에 저장.
  1. Bootstrap ClassLoader
    자바 런타임 코어 클래스 로드
  2. Extension ClassLoader
    Bootstrap Class 부모로 설정, 필요시 부모로 작업 위임
  3. Application ClassLoader
    지정된 클래스 패스에 위치한 클래스 로드, Application에 해당되는 클래스들.

순으로 진행된다.

ClassNotFoundException? NoClassDefFoundError?

ClassNotFoundException 클래스 로더가 클래스 패스에서 해당 클래스를 찾을 수 없을 경우 발생하는 에러로

클래스 로더는 기본적으로
Application -> Extension -> Bootstrap 순으로 클래스를 찾게 되는데,

모두 진행 후 찾을 수 없는 경우 예외가 발생하게 된다.

NoClassDefFoundError 컴파일 타임에는 클래스가 존재하지만

런타임 당시에 클래스의 변경으로 인해 클래스의 스태틱 초기화 등으로

런타임 당시에 클래스를 찾을 수 없는 경우 예외를 발생하게 된다.

링크

링크의 경우 Verify, Prepare, Resolve 세단계로 나눠져 있으며, 아래와 같은 순서로 진행된다.

  1. Verify
    검증, .class 파일 형식이 유효한지 체크
  2. Prepare
    클래스 변수 (static 변수) 와 기본값에 필요한 메모리를 준비하는 과정
  3. Resolve (optional)
    심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
    이과정에서 진행 될 수 있고, 실제 메소드를 실행당시에 실행될 수도 있음.

초기화

Static 변수의 값 할당, static 블럭이 있을 경우 이때 실행된다.

마치며

클래스 로더는 Java 프로그램을 실행하는 데 필수적이며

내부적으로 사용되는 Bootstrap 클래스 로더는

다른 클래스 로더의 부모, 최상위 루트 클래스 로더 역할이며 JDK 내부 클래스를 로드합니다

Extension, Application 클래스 로더는

각각 Java 확장 디렉토리와 클래스 경로에서 클래스를 로드합니다


참고