Java

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

noahkim_ 2024. 12. 23. 19:34

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


1. JPMS

  • Java 9에서 도입된 모듈 시스템
항목 설명
목적
모듈 단위의 캡슐화, 격리, 의존성 명시를 통해 기존 클래스패스 구조의 불안정성 해결
기존 대비 차이점
클래스패스는 런타임 의존성 오류 발생 가능
→ JPMS는 컴파일 타임 의존성 체크
핵심 파일
module-info.java (모듈 경계와 공개 범위 정의)
호환성
기존 클래스패스와 병행 사용 가능 (--module-path vs --class-path)

 

module-info.java

키워드 설명
requires
다른 모듈을 참조(의존)
exports
모듈 내부 패키지를 외부에 공개
uses
서비스 인터페이스 사용 명시 (e.g. ServiceLoader)
provides
uses 대상 인터페이스의 구현체 제공 명시
open
리플렉션 허용용 → 특정 패키지를 리플렉션 API에 공개

 

 

모듈 경로

항목 설명
모듈 경로 (--module-path)
모듈들이 위치하는 디렉토리.
클래스패스와 별개로 존재
모듈 판단 기준
.class 파일에 module-info.java가 포함되어 있으면 해당 JAR은 모듈로 간주됨

 

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

클래스 로드 계층 구조

클래스 로더 설명
부트스트랩 클래스 로더
JVM 내장. 핵심 모듈 로딩(e.g. java.base, java.logging)
플랫폼 클래스 로더
기존의 확장 클래스 로더 대체
플랫폼 관련 모듈 로딩(e.g. java.se, java.sql)
애플리케이션 클래스 로더
사용자 코드 로딩 (JAR, 클래스)
애플리케이션 및 의존 모듈 포함(e.g. jdk.hotspot.agent)

 

클래스 로더의 담당 모듈

클래스 로더 담당 모듈 예시
부트스트랩
java.base, java.datatransfer, java.rmi, java.logging
플랫폼
java.compiler, java.se, java.xml, jdk.accessibility
애플리케이션
사용자 정의 클래스, 외부 JAR, jdk.hotspot.agent, jdk.aot 등

 

BuiltinClassLoader

  • Java 9 이후 기본 클래스 로더 (URLClassLoader에서 진화)
  • 부트스트랩, 플랫폼, 애플리케이션 클래스 로더를 내부에서 분기 처리
  • 모듈 의존성, 접근성, 계층 구조 등을 모듈 시스템 수준에서 통제

 

기타 변화

항목 설명
JAVA_HOME/jre 삭제
Java 9부터 디렉토리 통합 (모듈 단위로 구성됨)
확장 디렉토리 삭제
lib/ext 대신 모듈 시스템 사용
모듈 경로 지정
(--module-path)
--module-path를 통해 명시적으로 모듈 위치 지정 가능
클래스패스와 분리 (--class-path)