JVM이란

JVM(Java Virtual Machine)은 자바를 실행하기 위한 가상 머신입니다. JVM을 사용하는 이유는 Java 코드를 어떤 OS 환경에서도 작동하도록 하기 위해서 입니다. OS 별로 명령어와 아키텍쳐가 다릅니다. 그렇기 때문에 여러 OS에서 프로그램을 동작시키기 위해서는 OS 마다 각자에 맞는 기계어가 필요합니다. 이럴 경우 사용자는 어떤 OS에서 동작하는지를 알아야 하기 때문에 자바 코드가 하드웨어에 의존적일수 밖에 없습니다. JVM은 바이트 코드를 OS에 맞는 기계어로 번역해줍니다.JVM이 OS에 맞추어 추상화 해주기 때문에 사용자는 OS를 전혀 신경쓸 필요 없습니다.

 

자바 프로그램 실행 과정

JVM의 구성

JVM의 구성

JVM은  Class Loader, Execution Engine, Runtime Data Area로 이루어져있습니다. 

JVM의 동작 과정은 먼저 자바 프로그램 실행 시 JVM은 OS로부터 메모리를 할당받습니다. 이후 Class Loader가 JVM에 클래스 파일을 올립니다. 올라간 바이트 코드를 Excution Engine이 읽고 실행합니다.

1. Class Loader

Class Loader에는 3가지 단계가 있습니다.

1. Loading

- 클래스 파일을 읽고 메모리에 로드

2. Linking

- 클래스 파일의 유효성 검사

- 클래스에 필요한 메모리 할당 

- 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환

3. Initialization

- 클래스 파일들의 변수 값 초기화

 

즉, Class Loader은 클래스를 JVM에서 사용할 수 있도록 준비하는 역할을 합니다.

2. Execution Engine

Execution Engine은 ClassLoader을 통해 메모리에 적재된 바이트 코드를 명령어 단위로 읽고 실행합니다.

Execution Engine이 바이트 코드를 읽는 방식은 Java Interpreter와 JIT compiler 2가지가 있습니다.

1. Java Interpreter

- 바이트 코드 명령어를 한줄씩 읽고 실행

- 같은 명령어라도 항상 새로 호출,해석,실행해야 하기 때문에 실행 속도가 느리다

2.JIT(Just In Time) Compiler

- 프로그램 시작 시 바이트 코드를 기계어로 번역하는 방식

- 번역된 기계어는 메모리에 캐시되어 나중에 재사용

- 기계어로 번역은 프로그램 시작 전 한 번 이루어짐

 

GC(garbage collector)

GC는 Heap 메모리 영역에서 더이상 사용되지 않는 메모리를 자동으로 할당 해제해줍니다.

 

3. Runtime Data Area

Runtime Data Area는 JVM의 메모리 영역입니다. 자바 프로그램을 실행할때 필요한 데이터들을 저장하는 공간입니다.

Runtime Data Area

 

 

Runtime Data Area는 Method Area, Heap, Stack, Native Method Stack, PC Register 5개의 공간으로 구성되어있습니다.

1. Method Area

Method Area는 JVM이 처음 시작할 때 생성되는 영역입니다. 이는 모든 쓰레드가 공유합니다.

1. Class Metadata 

로딩된 클래스에 대한 정보(클래스 이름, 부모 클래스 이름, 클래스의 변수와 메서드 등)

2. Static Variable

Static Variable은 처음 로딩될 때 Method Area에 저장되며, 프로그램의 라이프타임동안 존재

3. Constant Pool

클래스 파일에 있는 상수들은 Constant Pool에 저장됩니다. 메서드나 필드에 대한 참조, 원시 타입등이 저장됩니다.

4. Reflection Data

클래스나 메서드에 접근하기 위한 데이터가 저장됩니다.

 

즉 정적인 필드와 클래스에 대한 정보를 가지고 있습니다.

 

2. Heap

Heap은 프로그램의 동적 메모리 영역입니다. 프로그램 실행 동안 Heap 영역에서 객체가 생성되고 소멸합니다.

메서드 영역과 마찬가지로 모든 쓰레드가 공유해서 사용합니다.  

Heap은 Young Generation, Old Generation 영역으로 구분되어 있습니다.

1. Young Generation 

Young Generation은 새롭게 생성된 객체들이 할당되는 공간입니다.

Eden :  새로운 객체들이 새롭게 할당되는 곳

Survivor Space : Eden에서 일정 시간 살아남은 객체들이 이동되는 공간

대부분의 객체들은 Eden에서 생성되고 빠르게 

2. Old Generation

Young Generation에서 살아남은 객체들이 할당되는 공간입니다.

 

이런 세분화된 메모리 구조는 객체의 수명주기에 맞게 효율적으로 메모리를 관리하고 GC를 최적화 하는데 도움을 줍니다.

 

3.Stack

Stack프로그램의 실행 흐름을 제어하고 메서드 호출, 지역변수 저장에 사용되는 영역입니다. Heap, Method Area와는 다르게 쓰레드마다 하나의 Stack을 가지고 있습니다. 메서드가 호출될 때마다 새로운 프레임이 스택에 추가됩니다. 프레임은 메소드의 지역 변수, 매개 변수, 메소드에 필요한 임시 데이터를 저장합니다. 메서드가 종료되면 해당 프레임이 스택에서 제거됩니다.

4. Program Counter Register 

Program Counter Register은 쓰레드가 시작할 때 생성됩니다. 현재 실행중인 명령어의 주소를 가리킵니다.

5. Native Method Stack

Native Method Stack은 기계어로 작성된 프로그램을 실행하는 영역입니다.

 

'자바' 카테고리의 다른 글

[JAVA] JDK  (0) 2024.01.05

+ Recent posts