저우즈밍 님의 "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) |
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 8-2. 바이트코드 실행 엔진: 바이트코드 해석 (0) | 2024.12.24 |
---|---|
[JVM 밑바닥까지 파헤치기] 8-1. 바이트코드 실행 엔진: 런타임 (0) | 2024.12.24 |
[JVM 밑바닥까지 파헤치기] 7-2. 클래스 로딩 매커니즘: 클래스 로더 (0) | 2024.12.23 |
[JVM 밑바닥까지 파헤치기] 7-1. 클래스 로딩 매커니즘: 클래스 로딩 처리 과정 (3) | 2024.12.23 |
[JVM 밑바닥까지 파헤치기] 6-2. 클래스 파일 구조: 바이트코드 명령어 (2) | 2024.12.22 |