Java

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

noahkim_ 2024. 12. 23. 18:51

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

 

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

 

1. 클래스 동치 조건

  • 같은 클래스 로더로 로딩되어야 동치 관계의 클래스라 판단함
  • 서로 다른 클래스 로더로 같은 .class를 로드하면 완전히 다른 타입으로 취급됨

 

2. 부모 위임 모델

특징 설명
위임 순서
상위 클래스 로더에게 먼저 위임, 실패하면 자기 자신이 로드 시도
이점
핵심 Java API 중복 로딩 방지, 보안성 향상
접근 제한
🔹 자식 → 부모 접근 가능
🔹 부모 → 자식 접근 불가

 

3. 주요 클래스 로더 구조

클래스 로더 설명
부트스트랩 클래스 로더 JVM 내장
JDK 기본 클래스 로딩 (JAVA_HOME/lib 또는 -Xbootclasspath)
확장 클래스 로더
lib/ext 또는 java.ext.dirs 내의 클래스 로딩
sun.misc.Launcher$ExtClassLoader
애플리케이션 클래스 로더
사용자 클래스패스(classpath) 기반 클래스 로딩
sun.misc.Launcher$AppClassLoader

 

4. 예외 상황: 기본 API에서 SPI를 호출할 경우

  • SPI는 JDK 클래스가 사용자 구현체를 호출해야 하는데, 이 경우 부모 → 자식 접근 불가 원칙 때문에 실패 가능
  • 해결 방법: 스레드 컨텍스트 클래스 로더로 우회하기
    • Thread.currentThread().setContextClassLoader(...)
    • 사용자 정의 클래스 로더를 명시적으로 전달해 자식 로더의 클래스를 접근 가능하게 만듦

 

5. 핫 모듈 시스템 (OSGi)

  • 각 모듈이 자체 클래스 로더를 가지며, 동적으로 추가/제거/갱신 가능한 시스템
항목 설명
장점
모듈 단위 격리 + 유연한 클래스 관리 + 런타임 재배포 가능
예시 환경
Eclipse 플러그인, IoT 게이트웨이 시스템 등에서 활용