Java

[JVM 밑바닥까지 파헤치기] 7-3. 클래스 로딩 매커니즘: 자바 모듈 시스템

noahkim_ 2024. 12. 23. 19:34

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


1. JPMS

  • Java 9에서 도입된 모듈 시스템
  • 자유롭게 설정 가능한 캡슐화 격리 매커니즘
    • 모듈 경계를 통해 각 모듈이 서로의 내부를 참조하지 못함
  • 기존의 클래스패스에 의존한 안정성 문제를 해결
    • 의존성이 실제 존재하는지는 런타임에서 확인되었음
    • 컴파일 타임에서 의존성 체크 후 실행 (모듈간의 의존성이 먼저 정의되어 있음)

 

모듈 정의
  • module-info.java
  • 경계 정의

 

구성
  • requires: 수입하는 모듈 목록
  • exports: 내보내는 모듈 목록
  • uses: 수입하는 서비스 목록
  • provides: 내보내는 서비스 목록
  • open: 내보내는 리플렉션 API 목록

 

모듈 호환성

모듈 패스
  • 모듈 시스템에서 모듈이 위치하는 경로
  • 기존 클래스패스 방식과 호환되도록 도입된 방식
  • module-info.java 존재 여부로 모듈 여부가 판단됨

 

2. 모듈화 시대의 클래스 로더

플랫폼 클래스 로더

  • 확장 클래스 로더가 플랫폼 클래스 로더로 대체됨
  • JDK 전체가 모듈화되면서 모듈들 안의 클래스 라이브러리들은 필요성을 잃음
  • JAVA_HOME/jre 디렉토리가 사라짐

 

BuiltinClassLoader

  • 부트스트랩, 플랫폼, 애플리케이션 클래스 로드의 확장 클래스 (URLCLassLoader에서 변경됨)
  • 모듈 간 의존성을 관리함

 

담당 모듈

부트스트랩 클래스 로더
  • 기본 모듈을 포함한 핵심 모듈 로드
  • java.base, java.datatransfer, java.logging, java.rmi, java.naming

 

플랫폼 클래스 로더
  • 기존의 확장 클래스 로더를 대체
  • JDK 모듈 로드
  • java.compiler, java.se, java.sql, java.xml, jdk.accessibility

 

애플리케이션 클래스 로더
  • 사용자 애플리케이션의 jar 파일 및 클래스 로드
  • 의존성이 요구됨
  • jdk.aot, jdk.hotspot.agent, jdk.internal.ed