JVM 구조
자바의 주요 장점 중 하나인 OS 플랫폼의 독립성이 있다. WORN (wtite once, run anywhere)
이를 가능하게 하는 것이 바로 JVM이다.
자바소스코드를 컴파일러가 컴파일하면 컴퓨터가 직접 해석 및 실행할 수 있는 바이트 코드가 되고
이를 JVM이 실행하여 Class Loader -> Bytecode verifier -> interpreter를 거쳐
자바 소스가 어느 환경에서든지 잘 구동 될 수 있도록 해준다.
- JVM 구성요소
- ClassLoader
- 컴파일러가 만든 클래스 파일을 JVM 내의 메모리영역 (Runtime Data Area)에 올리는 역할
- 이 과정은 런타임시 실행되지만, 필요하다면 계속해서 동작함.
- Garbage Collector
- 메모리 관리 기능을 자동으로 수행
- 애플리케이션이 생성한 객체의 생존 여부를 판단하여 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동으로 관리
- Execution Engine
- Class Loader를 통해 JVM 내의 메모리 영역에 배치된 바이트 코드를 실행
- 이때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행 (인터프리터 방식)
- Runtime Data Area : JVM 메모리 영역
- Method Area
- JVM에 의해 loading된 클래스들이 저장되며, 구현된 메소드, 상수들이 저장됨
- Heap Area
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
- new 연산자로 생성된 객체와 배열을 저장
- 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 Garbage Collector에 의해 관리된다
- 힙 영역의 사용 기간 및 스레드 공유 범위
- 객체가 더이상 사용되지 않거나 명시적으로 null 선언 시
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있음.
- 모든 스레드에서 공유
- Stack Area
- method가 호출될 때마다 스택 프레임이 생성. 이것이 쌓여 스택을 구성
- 컴파일시 size 및 life cycle이 정해짐
- 수행되는 method 정보, 지역변수, 매개변수, 연산 중 발생하는 임시데이터 저장
- 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
- 본(원시)타입 변수는 스택 영역에 직접 값을 가짐
- 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가짐.
- PC Register
- 현재 수행 중인 JVM 명령 주소
- 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
- CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장
- 연산 결과값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
- Native Method Stack Area
- 자바 외 언어로 작성된 네이티브 코드를 위한 Stack.
- 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택.
- 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장.
- Method Area
- ClassLoader
Heap Memory
- Young Generation
- 새로운 객체를 할당하기 위해 확보된 공간
- 객체가 사라질때 Minor GC가 발생
- 시간이 지나 우선순위가 낮아지면 Old 영역으로 이동함.
- GC가 사용하지 않는 객체들을 제거하고도 객체가 가득차면 Old Generation 영역으로 보냄.
- Eden
- 객체들이 최초로 생성되는 공간, new 연산지를 통해 생성된 객체가 위치
- 정기적인 가비지 수집 후 Eden 영역이 꽉 차면 라이프 주기가 길다고 판단되는 객체가
From (survivor1) 또는 To (suvivor2) 로 이동됨.
- From (survivor1) ,To (suvivor2)
- Eden에서 참조되는 객체가 Eden이 꽉 찼을 때 이동되는 공간.
- Olde Generation = Tenured
- Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역
- 보통 Young 영역보다 크게 할당되어 있으며 GC가 Young 영역보다 적게 발생
- 객체가 사라질 때 Major GC (Full GC) 가 발생
- (~ Java 7)Permanent Generation => (Java 8~) Meta Space
- 클래스와 메소드 메타 정보가 저장되는 공간
- static 변수와 static 메소드가 저장되는 공간
- Java 8 부터는 native area로 이동됨.
참고 블로그
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] Heap 모니터링 & Heap Dump 분석하기 (0) | 2022.10.26 |
---|---|
[JAVA] BigDecimal 과 사칙연산 (0) | 2022.09.14 |
[JAVA] List 중복 제거 (0) | 2022.09.01 |
[JAVA] 제네릭 Generic (0) | 2022.08.26 |
[JAVA] Map, HashMap (0) | 2022.08.24 |