Java

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

noahkim_ 2024. 12. 23. 01:23

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

 

0. 동적 로딩

  • 클래스가 필요할 때 클래스가 jvm에 동적으로 로드됨
  • 자바는 런타임에 클래스 로딩, 링킹, 초기화가 이루어짐

 

장점
  • 높은 확장성, 유연성
    • 런타임에 클래스를 동적으로 교체 가능
    • 네트워크나 외부 소스에서 클래스파일을 가져와 쓸 수 있음
    • JSP, OSGi
  • 런타입 바인딩 지원

 

단점
  • 성능 떨어짐

 

1. Loading

특징

클래스 로더 사용
  • 부트스트랩 클래스 로드 (JVM 내장)
  • 사용자 클래스 로더
    • 로드 방법 재정의 가능: ClassLoader의 findClass() or loadClass() 오버라이딩
  • 배열 클래스는 해당 없음
    • JVM이 직접 메모리에 동적으로 생성
    • 클래스 로더가 생성 X

 

과정

클래스를 정의하는 바이트 스트림을 가져옴
  • 여러 형식 지원
    • ZIP, DB, Network
    • Runtime: Dynamic Proxy
    • File: JSP

 

바이트 스트림을 런타임 데이터 구조로 바꿈
  • 메서드 영역에서 사용하기 위함

 

Class 객체를 Heap에 생성
  • 로딩 대상 클래스를 표현
  • 메서드 영역에 저장된 타입 데이터를 활용할 수 있게 도움

 

2. Linking

과정

Verification (Optional)
  • 바이트 스트림이 JVM 명세의 제약을 만족 여부 확인
  • 파일 형식
    • 매직넘버, 버전 번호, 상수 타입 지원 여부 등
  • 메타데이터
    • 상위 클래스 존재 여부, 상속 가능 여부, 필드 충돌 등
  • 바이트코드
    • 형변환 유효성, 점프 범위, 명령어의 타입 일치 
  • 심벌 참조
    • 참조 객체 접근 권한 검사

 

Preparation
  • 클래스 변수 메모리 할당
  • 클래스 변수 초기화
    • final O: 변수값 할당됨
    • final X: 변수값 디폴트 값으로 (할당 X)
  • JDK 8부터 힙에 저장됨

 

Resolution
  • 상수 풀의 심벌 참조를 직접 참조로 대체
  • 이름 기반의 간접 참조가 실제 메모리 주소를 가리키도록 변환되는 과정

 

3. Initialization (Optional)

<clinit> 실행

  • 컴파일러가 자동으로 생성
  • 부모클래스부터 실행됨

 

초깃값 할당
정적 블록 실행
  • 클래스가 직접 정의한 경우에만 수행됨
  • new, getstatic, putstatic, invokestatic