✔️ 자바 가상 머신
자바 가상 머신(Java Virtual Machine)이란?
- 가상 머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것
- 자바 가상 머신은 스택 기반의 가상 머신
- JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것
- 그리고 JVM은 Java와 운영체제 사이에서 중개자 역할을 수행하여 Java가 운영체제에 구애받지 않고 재사용을 가능하게 해줌
- 또한 가장 중요한 메모리 관리를 Garbage Collector를 통해 수행하게 됨
자바 가상 머신의 구성
- Class Loader (클래스 로더)
런타임 시에 JVM 내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행
동적 로드를 담당하며 사용하지 않는 클래스들은 메모리에서 삭제됨 - Execution Engine (실행 엔진)
클래스 로더가 JVM 내의 Runtime Data Area에 클래스의 바이트 코드를 배치시키면 실행 엔진에 의해 실행됨
실행 엔진은 바이트 코드를 명령어 단위로 읽어서 실제 JVM 내부에서 기계가 실행할 수 있는 형태로 변경함
인터프리터 방식과 JIT 컴파일러 방식으로 2가지 방식이 존재
- Interpreter (인터프리터)
자바 바이트 코드를 명령어 단위로 읽어서 실행하며 한 줄씩 실행하므로 느림 - JIT (Just In Time) 컴파일러
인터프리터의 단점을 보완하기 위해 등장했으며
인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고
이후에는 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식
네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드를 빠르게 수행할 수 있음
- Interpreter (인터프리터)
- Garbage Collector (GC)
Garbage Collection을 수행하는 모듈이 존재함 - Runtime Data Area
JVM이 프로그램을 수행하기 위해 운영체제로부터 할당받은 메모리 공간으로 용도에 따라 여러 영역으로 나누어 관리함
- PC Register
스레드가 시작될 때 각각의 스레드 별로 생성되는 공간으로 현재 수행 중인 JVM 명령어 주소를 가짐 - Stack Area
프로그램 실행 과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터인
메소드의 매개변수, 지역 변수 등을 저장 - Native Method Stack
Java 외의 언어로 작성된 네이티브 코드를 위한 영역으로
자바 프로그램이 컴파일 되어 생성되는 바이트 코드가 아닌, 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시킴 - Method Area (Static Area, Class Area)
클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 메모리 공간으로
모든 스레드가 공유하는 메모리 영역이므로 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관함
별도의 관리 영역인 Runtime Constant Pool가 존재하여 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행 - Heap Area
객체를 저장하는 가상 메모리 공간으로 런타임 시 동적으로 할당하여 사용하는 영역
new 연산자로 생성된 객체와 배열을 저장하게 되며
클래스 영역에 올라온 클래스들로만 객체로 생성할 수 있으며, 세 부분으로 나뉘어짐
- New/Young Generation
Eden은 객체들이 최초로 생성되는 공간이며 Survivor Space에는 Eden에서 참조되는 객체들이 저장되게 됨
Eden에서 인스턴스가 가득차게 되면 GC가 발생하게 되고
Eden에 있는 값들을 Suvivor 1 영역에 복사하고, 이 영역을 제외한 나머지 영역의 객체를 삭제하게 됨 - Old Generantion
New Generation에서 일정 시간 참조되고 살아남은 객체들이 저장되는 공간으로
Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역으로 이동하고,
이 과정을 반복하다가 살아남은 객체는 Old Generation으로 이동하게 됨 - Permant Generation
생성된 객체들의 주소값이 저장되는 공간으로 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용됨
- New/Young Generation
- PC Register
'Tech Interview > Language' 카테고리의 다른 글
[Language] 가비지 컬렉션 (0) | 2024.03.05 |
---|---|
[Language] Java 컴파일 과정 (0) | 2024.03.04 |
[Language] Java 언어의 장단점 (0) | 2024.02.21 |
[Language] Java와 C/C++의 차이점 (0) | 2024.02.20 |
[Language] Java SE와 Java EE 애플리케이션 차이 (0) | 2024.02.20 |