contents

JVM(Java Virtual Machine)이란?

JVM의 동작 원리

  1. 자바 소스 코드(.java 파일)는 자바 컴파일러에 의해 바이트코드(.class 파일)로 변환됩니다.
  2. JVM은 이 .class 파일을 로드하고, 바이트코드를 검증한 후 실행 엔진을 통해 실행합니다.
  3. JVM은 메모리 관리, 가비지 컬렉션, 보안, 플랫폼 추상화 등 다양한 서비스를 제공합니다.

JVM 아키텍처(구조)

JVM은 여러 주요 하위 시스템과 메모리 영역으로 구성되어 있습니다. 각 구성 요소를 자세히 살펴보겠습니다.

1. 클래스 로더 서브시스템(Class Loader Subsystem)

2. 런타임 데이터 영역(JVM 메모리 구조)

영역 설명 공유/스레드별
메서드 영역 클래스 메타데이터, static 변수, 메서드 코드, 상수 풀 저장 공유
힙(Heap) 모든 자바 객체와 배열 저장, 가비지 컬렉션 대상 공유
자바 스택 각 스레드마다 존재, 지역 변수, 연산 결과, 메서드 프레임 저장 스레드별
PC 레지스터 각 스레드마다 존재, 현재 실행 중인 명령어의 주소 저장 스레드별
네이티브 메서드 스택 자바가 아닌 네이티브 메서드(C/C++ 등) 호출 시 정보 저장 스레드별

세부 설명

3. 실행 엔진(Execution Engine)

4. 네이티브 인터페이스 및 라이브러리

JVM의 보안

JVM의 다양한 구현체

JVM과 다른 언어

JVM 아키텍처 다이어그램(텍스트로 표현)

아래는 JVM 아키텍처를 텍스트로 표현한 예시입니다.

+-------------------------------------------------------------+
|                    Java Virtual Machine (JVM)               |
|                                                             |
|  +-------------------+    +-----------------------------+   |
|  |   Class Loader    |    |     Runtime Data Areas      |   |
|  |   Subsystem       |    |                             |   |
|  +-------------------+    |  +----------------------+  |   |
|                           |  |    Method Area        |  |   |
|                           |  +----------------------+  |   |
|                           |  |    Heap              |  |   |
|                           |  +----------------------+  |   |
|                           |  |    Java Stacks       |  |   |
|                           |  +----------------------+  |   |
|                           |  |    PC Registers      |  |   |
|                           |  +----------------------+  |   |
|                           |  |    Native Method     |  |   |
|                           |  |    Stacks            |  |   |
|                           |  +----------------------+  |   |
|                           +-----------------------------+   |
|  +-----------------------------------------------------+    |
|  |             Execution Engine                        |    |
|  |  - Interpreter                                      |    |
|  |  - JIT Compiler                                     |    |
|  |  - Garbage Collector                                |    |
|  +-----------------------------------------------------+    |
|  +-----------------------------------------------------+    |
|  | Native Interface (JNI) and Native Libraries         |    |
|  +-----------------------------------------------------+    |
+-------------------------------------------------------------+

JVM의 주요 특징과 장점

아래는 JVM의 메모리 구조와 **가비지 컬렉션(GC)**에 대한 매우 상세한 설명입니다.

JVM 메모리 구조

JVM의 메모리는 크게 **Heap(힙)**과 Non-Heap(비힙) 영역으로 나뉩니다. 여기서 GC가 직접적으로 관리하는 영역은 주로 힙입니다.

힙(Heap) 메모리

Young Generation (영 영역)

Old Generation (Tenured, Old 영역)

Metaspace (Java 8 이상)

JVM 메모리 구조 예시 (텍스트 다이어그램)

+----------------------------------------------------+
|                    JVM 메모리                      |
|                                                    |
|  +-------------------+    +---------------------+  |
|  |   Method Area     |    |      힙 (Heap)      |  |
|  | (클래스/메타정보) |    |                     |  |
|  +-------------------+    | +-----------------+ |  |
|                           | | Young Generation| |  |
|                           | |  - Eden         | |  |
|                           | |  - Survivor S0  | |  |
|                           | |  - Survivor S1  | |  |
|                           | +-----------------+ |  |
|                           | +-----------------+ |  |
|                           | | Old Generation  | |  |
|                           | +-----------------+ |  |
|                           +---------------------+  |
+----------------------------------------------------+

가비지 컬렉션(GC, Garbage Collection)

GC의 기본 원리

세대별(Generational) GC

GC 동작 과정 (예시)

  1. 객체 생성 시: Eden에 할당.
  2. Eden이 가득 차면 Minor GC 발생:
    • 살아있는 객체는 Survivor S0로 이동, 죽은 객체는 제거.
  3. 다음 Minor GC:
    • Eden + S0의 살아남은 객체는 S1로 이동, 나머지는 제거. S0는 비워짐.
    • S0/S1은 번갈아 사용(핑퐁 구조).
  4. 여러 번 Minor GC에서 살아남으면: 객체는 Old Generation으로 승격(Promotion).
  5. Old Generation이 가득 차면 Major GC(Full GC) 발생:
    • 살아있는 객체만 남기고, 죽은 객체는 제거 및 메모리 압축.

GC의 종류 (JVM 제공)

GC 종류 특징 및 사용처
Serial GC 단일 스레드, 작은 힙/단일 코어에 적합, 전체 중지
Parallel GC 멀티스레드, Throughput 중시, 기본 GC
CMS GC 동시 마크-스윕, 짧은 중지, 낮은 레이턴시
G1 GC 큰 힙/낮은 레이턴시, 영역 분할, 동적 조절
ZGC, Shenandoah 초저지연, 대용량 힙, 실시간/클라우드 환경

추가 정보 및 주의사항

요약

Garbage-First (G1) 가비지 컬렉터

G1 GC는 Java 9부터 기본 가비지 컬렉터로 채택된 알고리즘으로, 큰 힙을 가진 애플리케이션을 위해 설계되었으며 예측 가능한 일시 정지 시간과 높은 처리량을 목표로 합니다.

주요 특징

G1 작동 방식

단계 설명
Young GC (Minor GC) Eden과 Survivor 영역의 살아있는 객체를 새로운 Survivor 또는 Old 영역으로 복사합니다. (Stop-the-World 이벤트)
동시 마킹(Concurrent Marking) 애플리케이션 실행 중에 힙 전체의 살아있는 객체를 마킹합니다.
혼합 GC(Mixed GC) Young 영역과 가비지가 많은 Old 영역 일부를 함께 수집합니다.
이동(Evacuation) 가비지가 많은 영역에서 살아있는 객체를 새로운 영역으로 복사해 메모리를 확보하고 단편화를 줄입니다.
압축(Compaction) 객체를 이동시키면서 메모리를 압축해 단편화를 방지합니다.

요약:
G1 GC는 예측 가능한 일시 정지 시간과 큰 힙에 적합하며, 지속적으로 메모리를 압축하여 단편화를 방지합니다.

Concurrent Mark Sweep (CMS) 가비지 컬렉터

CMS GC는 오래된 가비지 컬렉터로, 긴 Stop-the-World 일시 정지를 줄이기 위해 설계된 저지연(로우 레이턴시) 수집기입니다.

주요 특징

CMS 작동 방식

단계 설명
초기 마킹(Initial Mark) 짧은 Stop-the-World 일시 정지. 루트에서 직접 참조하는 객체를 마킹합니다.
동시 마킹(Concurrent Mark) 애플리케이션이 계속 실행되는 동안 GC 스레드가 객체 그래프를 탐색하며 살아있는 객체를 찾습니다.
동시 사전 정리(Concurrent Pre-clean) 마킹 중 변경된 객체를 추가로 마킹합니다.
재마킹(Remark) 또 다른 Stop-the-World 일시 정지. 동시 마킹 중 놓친 객체를 마킹합니다.
동시 스윕(Concurrent Sweep) 애플리케이션 실행 중에 도달 불가능한 객체를 제거하고 메모리를 해제합니다.
리셋(Reset) 다음 GC 주기를 준비합니다.

요약:
CMS는 대부분 작업을 동시 처리해 일시 정지 시간을 줄이지만, 단편화 문제와 CPU 자원 소모가 크며 최신 Java 버전에서는 G1 GC로 대체되고 있습니다.

Z Garbage Collector (ZGC)

ZGC는 Java 11에 실험적으로 도입되어 이후 안정화된 초저지연(ultra-low latency) 가비지 컬렉터입니다. 매우 큰 힙(수십 GB~TB 규모)과 엄격한 일시 정지 시간 요구에 적합합니다.

주요 특징

ZGC 작동 방식

단계 설명
일시 정지 마킹 시작(Pause Mark Start) 매우 짧은 일시 정지로 마킹 시작 신호를 보냅니다.
동시 마킹(Concurrent Mark) 애플리케이션 실행 중에 살아있는 객체를 마킹합니다.
일시 정지 마킹 종료(Pause Mark End) 짧은 일시 정지로 마킹을 마무리합니다.
동시 이동 준비(Concurrent Prepare for Relocation) 객체 이동 준비를 동시 처리합니다.
일시 정지 이동 시작(Pause Relocate Start) 이동 시작을 알리는 짧은 일시 정지입니다.
동시 이동(Concurrent Relocate) 애플리케이션이 계속 실행되는 동안 객체를 이동시키고, 로드 배리어와 컬러드 포인터로 참조를 안전하게 업데이트합니다.

요약:
ZGC는 매우 큰 힙과 초저지연을 요구하는 애플리케이션에 적합하며, 거의 모든 GC 작업을 동시 처리하여 일시 정지 시간을 극도로 줄입니다.

비교표

GC 종류 힙 구조 세대별 여부 압축 여부 동시 처리 정도 일시 정지 시간 적합한 용도
G1 영역(region) 기반 부분적 낮고 예측 가능 큰 힙, 예측 가능한 지연 시간 필요
CMS 연속 공간 아니오 부분적 낮음 (Old Gen) 저지연, 레거시 시스템
ZGC 영역(Z-Page) 기반 초기엔 아니오 (Java 21부터 예) 거의 전부 초저지연 (<1ms) 매우 큰 힙, 초저지연 요구

references