제리의 배움 기록

[Java] JVM 클래스 로더 본문

자바

[Java] JVM 클래스 로더

제리92 2022. 1. 13. 23:47

요약

  1. 클래스 로더에는 3가지 종류가 있고 각자 맡은 대상 클래스 영역이 다릅니다.
  2. Java 9를 전후로 각 클래스 로더에 차이가 있습니다.
  3. 클래스 로더의 동작 방식은 동일합니다.

클래스 로더 - Java 9 이전 (~ Java 8)

클래스 로더에는 3가지 종류가 있습니다.

1.Bootstrap Class Loader

  • rt.jar로 부터 JVM을 실행하기 위한 핵심 클래스들을 메모리로 로딩합니다.
    • rt.jar는 일반적으로 다음 경로에 위치합니다. /jre/lib/rt.jar
  • JVM의 빌트인 되어있는 클래스 로더이며 null 로 표현됩니다. parent를 가지지 않습니다.
  • 네이티브 코드로 구현되어 있습니다.

2.Extension ClassLoader

  • 시스템 속성 값인 java.ext.dirs 경로의 JAR 파일들로 부터 클래스를 로딩합니다.
    • java.ext.dirs의 기본값은 /jre/lib/ext 입니다.
  • jdk 확장 라이브러리들을 다룹니다.

3.Application ClassLoader

  • Application Class Loader는 자바 애플리케이션 CLASSPATH의 모든 클래스들을 로딩합니다.

클래스 로더 - Java 9

Jigsaw 프로젝트로 Java 9 에서는 모듈 시스템이 도입되었습니다.

기존 JDK의 파일들이 작은 단위의 모듈로 분리되고, 더 효율적인 포맷으로 변환되었습니다. 또한 불필요한 파일들은 제거되기도 했습니다.

Jigsaw 프로젝트 참조

 

[Java] JSR 376 - Java Platform Module System(Jigsaw)

Java Platform Module System Java 9의 가장 큰 특징은 Jigsaw 프로젝트를 통한 Java Platform Module System 도입입니다. Jigsaw 프로젝트의 주요 내용은 다음과 같습니다. 1. Modular JDK JDK를 작은 단위의..

jerry92k.tistory.com


이에 따라 클래스 로더의 정의도 다음과 같이 변경됩니다.

1.Bootstrap ClassLoader

  • 기존에는 모든 platform(Java SE) 클래스들을 로더 할 수 있었지만, rt.jar가 모듈화 되어 작은 단위로 나뉘면서 java.base와 같은 중요한 모듈의 클래스 로딩만 다루게 역할이 축소되었습니다.
  • parent에서 모든 platform 클래스가 보이길 기대하면서 parent 클래스 로더로 null을 사용했던 코드는 문제가 될 수 있습니다. (null 이 의미하는 Bootstrap ClassLoader가 더이상 그 역할을 하지 않으므로) 그러한 의도로 사용하고자 하는 경우에는 parent 클래스 로더로 Platform ClassLoader를 전달하도록 수정해야합니다. ( ClassLoader.getPlatformClassLoader)

2.Extension Class LoadingPlatform ClassLoader (이름 변경)

  • 기존에는 URLClassLoader 의 인스턴스였지만 내부 클래스의 인스턴스로 변경 되었습니다.
  • Java SE 플랫폼에 있는 모든 클래스들에 대해 로더 역할을 할 수 있습니다.
  • Java SE 플랫폼에 있지 않은 표준화된 JCP(Java Community Process) 클래스에 대해서도 로더 역할을 할 수 있습니다.
  • Platform ClassLoader가 로더 역할을 할 수 있다고 하여서 실제로 해당 클래스가 Platform ClassLoader에 의해 로딩 된다는 것을 의미하진 않습니다. Java SE 플랫폼의 어떤 클래스들은 Bootstrap ClassLoader에 의해 로딩되고, 어떤 클래스들은 Platform ClassLoader에 의해 로딩됩니다.

3.Application Class LoadingSystem ClassLoader (이름 변경)

  • 기존에는 URLClassLoader 의 인스턴스에서 내부 클래스의 인스턴스로 변경 되었습니다.
  • Java SE나 JDK 모듈이 아닌 모듈들에 대해 default 로더 역할을 할 수 있습니다.

클래스 로더 동작 방식

클래스 로더의 동작 방식은 Java 9 에서도 동일합니다. (클래스 로더 이름은 Java 9 기준으로 설명하겠습니다.)

클래스 로더는 기본적으로 lazy-loading 방식으로 동작합니다. (lazy-loading은 실제로 해당 클래스가 사용될 때 까지 로딩을 지연하는 것을 뜻합니다.)

JVM 프로세스가 실행되면 클래스 로더(Class Loader)가 애플리케이션에 사용되는 클래스들을 메모리로 로딩합니다.

Bootstrap ClassLoader는 JVM start-up 시점에 클래스들을 메모리로 로딩합니다.

Platform ClassLoader와 System ClassLoader는 런타임에 해당 클래스가 사용될때 클래스를 메모리로 로딩합니다.

클래스 로딩은 다음과 같은 절차로 동작합니다.

1.JVM의 클래스 로더가 System ClassLoader 에게 클래스 로딩을 요청합니다.

2.System ClassLoader은 Platform ClassLoader로 클래스 로딩을 위임합니다.

3.Platform ClassLoader은 Bootstrap ClassLoader으로 클래스 로딩을 위임합니다.

"즉, 다음과 같은 위임이 이루어집니다. "
System ClassLoader → Platform ClassLoader → Bootstrap ClassLoader

4.Bootstrap ClassLoader의 관리 대상 클래스이면 로딩 후 반환합니다.

5.Bootstrap ClassLoader의 관리 대상이 아니면, Platform ClassLoader에서 관리 대상 클래스인지 확인합니다.

6.Platform ClassLoader의 관리 대상 클래스이면 로딩 후 반환합니다.

7.Platform ClassLoader의 관리 대상이 아니면, System ClassLoader에서 관리 대상 클래스인지 확인합니다.

8.System ClassLoader의 관리 대상 클래스이면 로딩 후 반환합니다.

9.System ClassLoader의 관리 대상이 아니면 ClassNotFoundException 오류를 발생시킵니다.

 

[참고]

How to Warm Up the JVM

Java 클래스 로딩 과정(Java Class Loading Process)

JVM에 관하여 - Part 2, ClassLoader

Unserstanding Extention Class Loading

GeeksforGeekes

docs oracle - javase 9 migrate

Comments