Java

[JVM 밑바닥까지 파헤치기] 7-2. 클래스 로딩 매커니즘: 클래스 로더

noahkim_ 2024. 12. 23. 18:51

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

  • 가상 머신 외부에서 다양한 방식으로 바이트 스트림을 로드하도록 하는 방법

 

1. 독립적인 공간

  • 같은 클래스 로더로 로딩되어야 동치 관계의 클래스라 판단함

 

2. 부모 위임 모델

상위 클래스 로더에게 위임
  • 처음부터 클래스 로드 시도 X
  • 자신의 차례가 와서야 하위 클래스 로더가 로드 시도

 

접근 제한

  • 자식 클래스 로더는 부모 클래스 로더에서 로드된 클래스를 접근할 수 있음
  • 부모 클래스 로더는 자식 클래스 로더에서 로드한 클래스를 접근할 수 없음

 

구조

부트스트랩 클래스 로더
  • JVM 내장
    • JAVA_HOME/lib or -Xbootclasspath
    • Class Lib

 

확장 클래스 로더
  • JVM 외부에 독립적으로 존재
  • java.lang.ClassLoader를 확장 (sun.misc.Launcher$ExtClassLoader)
  • 클래스 라이브러리를 확장하는 매커니즘
    • JAVA_HOME/lib/ext or java.ext.dirs (시스템 변수)

 

애플리케이션 클래스 로더
  • JVM 외부에 독립적으로 존재
  • java.lang.ClassLoader를 확장 (sun.misc.Launcher$AppClassLoader)
  • 클래스 라이브러리를 확장하는 매커니즘

 

예외

기본 API에서 SPI를 호출할 경우
  • 자식 클래스 로더에서 로드된 사용자 코드를 찾을 수 없음
  • 스레드 컨텍스트 클래스 로더로 특정 스레드에 대한 클래스 로더를 설정
  • 자식 클래스 로더의 클래스를 참조하도록 함

 

핫 모듈 시스템 (OSGi)
  • 모듈화된 환경에서 각 모듈이 동적으로 교체하거나 추가할 수 있도록 하는 것
  • 모듈별 자체 클래스 로더를 가지고 있음