저우즈밍 님의 "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
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 7-3. 클래스 로딩 매커니즘: 자바 모듈 시스템 (2) | 2024.12.23 |
---|---|
[JVM 밑바닥까지 파헤치기] 7-2. 클래스 로딩 매커니즘: 클래스 로더 (0) | 2024.12.23 |
[JVM 밑바닥까지 파헤치기] 6-2. 클래스 파일 구조: 바이트코드 명령어 (2) | 2024.12.22 |
[JVM 밑바닥까지 파헤치기] 6-1. 클래스 파일 구조: 클래스 파일 (0) | 2024.12.22 |
[JVM 밑바닥까지 파헤치기] 3-5. 가비지 컬렉터와 메모리 할당 전략: 저지연 가비지 컬렉터 (0) | 2024.12.21 |