Java/JVM

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

noahkim_ 2024. 12. 23. 01:23

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

 

1. 클래스 동적 로딩

  • JVM 프로그램 실행 도중, 해당 클래스가 처음 필요해지는 시점에 클래스를 메모리에 로드하는 방식
  • ✅ Lazy Loading 기반

 

장점

항목 설명 특징
확장성 새로운 기능을 기존 코드 수정 없이 추가 가능
- 모듈 단위 설계 가능
- 의존성 분리 가능
유연성
런타임 중에 기능을 교체/추가 가능
ex) OSGi, WAS, 핫스왑 구조
외부 클래스 로딩
네트워크/파일시스템 등에서 외부 .class를 로드할 수 있음
- 사용자 정의 ClassLoader를 통해 구현
- 꼭 로컬 classpath만 쓰지 않음
런타임 바인딩
컴파일 타임이 아닌 실행 중에 어떤 클래스가 사용될지 결정됨
- 다형성 제공
ex) SPI

 


예시) HotSwap

더보기
  • 실행중인 JVM에서 코드를 수정하고 바로 반영하는 기술
  • 새로운 ClassLoader를 만들어서 그 로더로 클래스를 다시 로드
  • 이전 로드는 참조를 끊어 GC 대상이 되게 함

 

예시) OSGi

더보기
  • 번들 단위로 독립적인 클래스 로더를 가지는 동적 모듈 시스템
  • ⚠️ 기존의 jar 단위의 배포는 모든 번들을 하나의 클래스패스에 다 올려야 해서 런타임 중 교체가 어렵고 버전 충돌이 심했음
  •  번들마다 자기 전용 ClassLoader를 가짐
  • ➡️ 런타임 중 모듈의 설치, 교체, 제거 가능
  • ➡️ 패키지 단위 의존성 관리와 버전 격리 가능

 

단점

  • 성능 떨어짐

 

과정

  1. Loading: 클래스의 바이트코드를 읽어와 JVM 메모리에 로드하는 단계 (클래스 로더 사용)
  2. Linking: 로드된 클래스가 실제 실행될 수 있도록 JVM 내부 구조에 연결하는 과정
  3. (Initialization): 클래스의 정적 초기화 코드인 <clinit> 메서드를 실행하는 단계

 

특징) Loading

더보기
  • Heap에 java.lang.Class 인스턴스 생성 (내부적으로 메타데이터를 참조하여 사용하도록 함)
  • 배열 클래스는 클래스 로더가 아닌 JVM이 직접 생성 (동적 생성 구조)

 

과정) Linking

더보기
단계 설명 항목
Verification JVM의 안전성 보장을 위한 검증 단계
- 파일 형식: 매직 넘버 버전 번호, 상수 타입 유효성 등
- 메타데이터: 상위 클래스 존재 여부, 필드 이름 충돌 여부
- 바이트코드 유효성: 명령어 유효성, 형변환 적절성
- 접근 제어 검증: 심벌 참조 대상의 접근 권한 확인
Preparation
클래스 변수의 메모리 할당 및 초기화
 
Resolution
상수 풀의 심벌 참조를 직접 참조로 변환
 

 

특징) Initialization

더보기
항목 설명  
부모 클래스 우선
상위 클래스의 <clinit>이 먼저 실행되고, 그 다음에 현재 클래스의 <clinit> 실행
실행 조건 아래 조건 중 하나라도 발생 시 실행됨 - new (인스턴스 생성)
- getstatic, putstatic (정적 필드 접근/수정)
- invokestatic (정적 메서드 호출)