Java 클래스 로더

동동주·2024년 3월 29일

CS스터디_자바

목록 보기
6/19

클래스 로더란?

자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스를 링크하고 로드하는 특징이 있다. 자바의 클래스 로딩은 클래스 참조 시점에 JVM에 코드가 링크되고, 실제 런타임 시점에 로딩되는 동적 로딩을 거친다.

  • 런타임에 동적으로 클래스를 로딩한다는 것은 JVM이 미리 모든 클래스에 대한 정보를 메소드 영역에 로딩하지 않는다는 것을 의미한다.
  • JVM 내에서 자바 바이트코드를 전달받는 클래스 로더는 자바가 동적으로 로드될 수 있도록 해주는 소프트웨어이다. 정리하자면, 클래스 로더는 런타임 중에 JVM의 메소드 영역에 동적으로 Java 클래스를 로드하는 역할을 한다.

클래스 로더의 종류

클래스로더에도 종류가 3가지로 나뉜다. 3가지 각각에 대해 살펴본다.

  • 부트스트랩 클래스로더
  • 확장 클래스로더 (혹은 Platform ClassLoader)
  • 어플리케이션 클래스로더 (혹은 System ClassLoader)

부트스트랩 클래스 로더(Bootstrap Class Loader)

JVM 시작 시 가장 최초로 실행되는 클래스 로더이다. 부트스트랩 클래스 로더는 자바 클래스를 로드하는 것이 아닌, 자바 클래스를 로드할 수 있는 자바 자체의 클래스 로더와 최소한의 자바 클래스(java.lang.Object, java.lang.Class, java.lang.ClassLoader, java.util.* 등)들을 로드한다.

  • Java 8
    - jre/lib/rt.jar 및 기타 핵심 라이브러리와 같은 JDK의 내부 클래스를 로드한다.
  • Java 9 이후
    - 더 이상 /re.jar이 존재하지 않으며, /lib 내에 모듈화되어 포함됐다. 이제는 정확하게 ClassLoader 내 최상위 클래스들만 로드한다.

확장 클래스 로더 (Extension Class Loader)

확장 클래스 로더는 부트스트랩 클래스 로더를 부모로 갖는 클래스 로더로서, 확장 자바 클래스들을 로드한다. java.ext.dirs 환경 변수에 설정된 디렉토리의 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext 에 있는 클래스 파일을 로드한다.

  • Java 8
    - URLClassLoader를 상속하며, jre/lib/ext 내 모든 클래스를 로드한다.
  • Java 9 이후
    - Platform Loader로 변경되었으며, URLClassLoader가 아닌 BuiltinClassLoader 를 상속한다. Inner Static 클래스로 구현되어 있다.

애플리케이션 클래스 로더(Application Class Loader)

자바 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스들을 로드한다. 쉽게 말하자면, 우리가 만든 .class 확장자 파일을 로드힌다.

  • 시스템 클래스 로더 (System Class Loader) 라고 불리기도 합니다.

클래스로더의 동작 방식

  • JVM의 Method Area에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.
  • Method Area에 클래스가 로드되어 있지 않을 경우, 시스템 클래스 로더에 클래스 로드를 요청한다.
  • 시스템 클래스 로더는 확장 클래스 로더에 요청을 위임한다.
  • 확장 클래스 로더는 부트스트랩 클래스 로더에 요청을 위임합니다.
  • 부트스트랩 클래스로더는 부트스트랩 Classpath(JDK/JRE/LIB) 에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 확장 클래스로더에게 요청을 넘긴다.
  • 확장 클래스 로더는 확장 Classpath(JDK/JRE/LIB/EXT) 에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 시스템 클래스 로더에게 요청을 넘긴다.
  • 애플리케이션 클래스로더는 시스템 Classpath에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 ClassNotFoundException을 발생시킨다.

0개의 댓글