Juuunew 살아남기

[JAVA] JVM 02 - 클래스 로더 (Class Loader) 본문

Language/JAVA

[JAVA] JVM 02 - 클래스 로더 (Class Loader)

Juuunew 2023. 1. 11. 15:14

클래스 로더는 JVM 내로 컴파일된 자바 코드(.class)를 동적으로 로드하고, 링크를 통해 레퍼런스를 연결하는 과정을 거치고 static 값들 초기화 및 변수에 할당 후 JVM의 메모리 영역인 Runtime Data Area에 배치한다.

 

클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우에 동적으로 메모리에 적재한다.

 

클래스 로더는 3단계로 진행된다.

로딩 -> 링크 -> 초기화

 

  • 로딩 (Loading) : 자바 바이트 코드( .class )를 메소드 영역에 저장한다. 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙(Heap)" 영역에 저장.
    • Bootstrap : JAVA_HOME/lib에 있는 코어 자바 API를 제공한다. (최상위 우선순위를 가진 클래스 로더)
    • 확장 (Extension) || 플랫폼 클래스 로더 : 부트스트랩 클래스 로더를 부모로 갖는 클래스 로더로서, 확장 자바 클래스들을 로드한다. JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
    • Application : Application 클래스 패스(어플리케이션을 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
  • 링크 (Linking)
    • 검증 (Verifying) : 읽어들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사
    • 준비 (Preparing) : 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비
    • 분석 (Resolving) : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
  • 초기화 (Initialization) : 클래스 변수들을 적절한 값으로 초기화 ( static 필드들이 설정된 값으로 초기화 )

클래스 로더의 원칙 세가지

  • 유일성 원칙
  • 위임 계층 원칙
  • 가시범위 원칙

유일성 원칙

 

하위 클래스 로더가 상위 클래스 로더에서 로드한 클래스를 다시 로드하지 않아야 한다는 원칙.

이 원칙이 지켜지지 않는다면 JVM에 동일한 클래스가 2개 이상 로드되는 상황이 발생.

 

위임 원칙

 

클래스 로딩이 필요한 경우 부모 클래스 로더 방향으로 클래스 로딩을 위임하는 것.

 

  1. JVM의 Method Area에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.
  2. Method Area에 클래스가 로드되어 있지 않을 경우, 애플리케이션 클래스로더에 클래스 로드를 요청한다.
  3. 애플리케이션 클래스로더는 확장 클래스로더에 클래스 로드를 요청한다.
  4. 확장 클래스로더는 부트스트랩 클래스로더에 클래스 로드를 요청한다.
  5. 부트스트랩 클래스로더는 부트스트랩 Classpath(JDK/JRE/LIB)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 확장 클래스로더가 요청을 수행하도록 한다.
  6. 확장 클래스로더는 확장 Classpath(JDK/JRE/LIB/EXT)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 애플리케이션 클래스로더가 요청을 수행하도록 한다.
  7. 애플리케이션 클래스로더는 애플리케이션 Classpath에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 ClassNotFoundException을 발생시킨다.

가시범위 원칙

 

하위 클래스 로더는 상위 클래스로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없다.

 

 

💡 공부 중 정리하는 내용이므로 부족한 부분이 있을 수 있습니다.

 

💡 참고자료

 

자바 메모리 구조 - 어라운드 허브 스튜디오

 

더 자바, 코드를 조작하는 다양한 방법 (인프런) - 백기선

 

더 자바, 코드를 조작하는 다양한 방법 - 인프런 | 강의

여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 "어떻게" 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방

www.inflearn.com

블로그 1

 

JVM. 클래스로더 서브시스템(Class Loader Subsystem)

JVM은 RAM에 위치하며, 실행 중에 클래스로더 서브시스템을 이용하여 클래스 파일을 RAM으로 가져옵니다. 이를 자바의 동적 클래스 로딩 기능이라고 합니다. 이 과정은 컴파일 타임이 아니라 런타

blog.hexabrain.net

블로그 2

 

자바의 클래스로더 알아보기

다음 자료들을 참고하여 작성하였습니다. Geeksforgeeks - Classloader in Java Baeldung - Java Classloaders 또한 아래 내용들은 JAVA8 기준으로 작성되었습니다.

leeyh0216.github.io