JVM(Java Virtual Machine) 이란?
자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어로 자바 가상 머신이라고 부른다. 자바 코드를 컴파일하면 이 코드는 자바 가상 머신 환경에서 실행된다. 이는 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다. 또한 GC(Garbage Collection)을 통해 메모리 관리도 수행한다.

Java는 .java 파일을 컴파일 하면 .class 파일이 생성된다. 이렇게 생성된 바이트 코드는 자바 가상 머신(JVM)이 운영체제에 맞는 실행 파일로 바꿔준다. 즉, 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작 가능하다.

※ 자바 가상 머신(JVM)의 동작 방식
1. 자바 프로그램(.java)을 실행하면 JVM은 OS로부터 메모리를 할당한다.
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일 한다
3. Class Loader를 통해 JVM Runtime Data Area로 로딩한다.
4. Runtime Data Area에 로딩된 .class 파일들은 Execution Engine을 통해 해석된다.
5. 해석된 바이트 코드(.class)는 Runtime Data Area 각 영역에 배치되어 수행되며 이 과정에서 GC의 작동과 스레드 동기화가 이루어진다.
JVM의 구조
클래스 로더 (Class Loader)

자바는 동적으로 클래스를 읽어온다. 즉, 컴파일 타임이 아니라 런타임(.class - 바이트 코드를 실행할 때)에 클래스 로드하고 링크한다. 이렇게 생성된 클래스 파일(바이트 코드)를 JVM이 OS로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 클래스 로더(Class Loader)가 수행한다.
실행 엔진 (Execution Engine)
클래스 로더에 의해 바이트 코드(.class)를 실행시키는 역할. 실행 엔진은 바이트코드를 명령어 단위로 읽어 실행한다.
가비지 컬렉터 (Garbage Collector)

JVM은 가비지 컬렉터(Garbage Collector, 이하 GC)를 이용하여 사용하지 않는 메모리를 자동으로 회수한다. GC 는 Heap 메모리 영억에 생성(적재)된 객체들 중 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다. GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드는 일시정지된다.
런타임 데이터 영역(Runtime Data Area)


런타임 데이터 영역은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 이 영역은 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있다.
Method Area (메소드_Static 영역)
모든 쓰레드가 공유하는 메모리 영역. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다. 클래스 멤버 변수의 이름, 데이터 타입, 파라미터, static 변수, final class 변수 등이 생성되는 영역
Heap Area (힙 영역)
모든 쓰레드가 공유하는 메모리 영역. new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
주기적으로 GC가 관리 및 제거하는 영역이다.

Heap Area (힙 영역) 는 위와 같이 3가지의 영역으로 나뉜다.
- Young Generation: 자바 객체가 생성되자 마자 저장되고, 생긴지 얼마 안된 객체가 저장되는 공간. Heap 영역에 객체가 생성되면 가장 먼저 Eden 영역에 할당된다. 그 뒤, 이 영역에 데이터가 어느정도 쌓이면 Survivor의 빈 공간으로 이동.
- Young Generation (Eden + Survivor) 영역이 차게 되면 Old 영역으로 이동되거나 회수된다. Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한번에 삭제하는 GC가 실행된다. 이 때, GC를 실행하는 쓰레드를 제외한 모든 쓰레드는 작업을 멈추게 된다. 이를 'Stop-the-World'라고 한다.
Stack Area (스택 영역)
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역.
PC 레지스터 (PC Register)
쓰레드(Thread)가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역.
'Programming Language > JAVA' 카테고리의 다른 글
| [프로그래머스] 순위검색 - 2021 KAKAO BLIND RECRUITMENT (0) | 2024.04.08 |
|---|---|
| 'The package java.sql is not accessible' 해결 (0) | 2024.03.14 |
| [Java] BFS vs DFS (0) | 2024.02.20 |
| [Java] 순열 - 조합 - 부분집합 정리 (0) | 2024.01.31 |
| [Java] Call by Value, Call by Reference (0) | 2024.01.18 |