JVM 구조 — 3층

JVM 구조 — 3층 An architecture diagram generated by Archify. .class / jar · Spring Boot fat jar · Architecture component .class / jar Spring Boot fat jar 1. 클래스로더 · 로딩 → 링킹(검증·준비·해석) → 초기화 · Architecture component 1. 클래스로더 로딩 → 링킹(검증·준비·해석) → 초기화 Metaspace ★ · 클래스 메타데이터 · 2. 런타임 데이터 영역 · 스레드 공유 Metaspace ★ 클래스 메타데이터 Heap · Eden / Survivor / Old · 2. 런타임 데이터 영역 · 스레드 공유 Heap Eden / Survivor / Old Code Cache ★ · JIT 컴파일 결과 · 2. 런타임 데이터 영역 · 스레드 공유 Code Cache ★ JIT 컴파일 결과 JVM Stack · 프레임(지역변수·피연산자 스택) · 2. 런타임 데이터 영역 · 스레드별 JVM Stack 프레임(지역변수·피연산자 스택) PC Register · 현재 실행 바이트코드 주소 · 2. 런타임 데이터 영역 · 스레드별 PC Register 현재 실행 바이트코드 주소 Native Stack · JNI 호출 스택 · 2. 런타임 데이터 영역 · 스레드별 Native Stack JNI 호출 스택 3. 실행 엔진 · 인터프리터 → JIT(C1/C2) → GC · Architecture component 3. 실행 엔진 인터프리터 → JIT(C1/C2) → GC 바이트코드 읽기 클래스 메타데이터 적재 프레임 실행 JIT 결과 저장 GC 수거 2. 런타임 데이터 영역 · 스레드 공유 2. 런타임 데이터 영역 · 스레드별

★ 네이티브 메모리

  • • Metaspace·Code Cache는 힙이 아니라 네이티브 메모리
  • • 컨테이너 memory limit은 이것까지 합쳐서 센다

스레드 공유 vs 스레드별

  • • 공유: Heap · Metaspace · Code Cache
  • • 스레드별: JVM Stack · PC Register · Native Stack

실행 엔진

  • • 처음엔 인터프리터로 해석 실행
  • • 자주 쓰는 코드만 C1→C2로 JIT 컴파일
  • • GC가 Heap의 죽은 객체를 회수