JVM(Java Virtual Machine) 힙(heap)과 가비지 컬렉션(Garbage Collection) 250515
q1: JVM(Java Virtual Machine) 힙(heap)과 가비지 컬렉션(Garbage Collection)
a1:
JVM(Java Virtual Machine)은 자바 바이트코드를 실행하기 위한 가상 머신으로, 내부적으로 여러 메모리 영역을 관리합니다. 그중 힙(heap) 과 가비지 컬렉션(Garbage Collection) 은 자바 메모리 관리의 핵심 개념입니다.
⸻
1. JVM 힙(heap)이란?
1. 역할
• 자바 애플리케이션이 실행되는 동안 생성되는 모든 객체(Object)와 배열(Array)이 저장되는 공간입니다.
• 동적으로 할당되는 메모리 영역으로, new 키워드를 통해 객체를 생성하면 이 힙 영역에 저장됩니다.
2. 구조
JVM 힙은 크게 두 영역으로 나뉩니다.
• Young Generation (신생 영역)
• 새롭게 생성된 객체들이 먼저 위치합니다.
• 다시 Eden 영역과 두 개의 Survivor 영역(S0, S1) 으로 구분됩니다.
• Old Generation (노년 영역, Tenured 영역)
• Young Generation을 여러 번 거쳐 생존한(즉, 오래 살아남은) 객체들이 이곳으로 이동합니다.

3. 튜닝 포인트
• -Xms (초기 힙 크기) & -Xmx (최대 힙 크기) 옵션으로 전체 힙 크기를 조정할 수 있습니다.
• Young/Old Generation 비율(-XX:NewRatio), Survivor 영역 크기(-XX:SurvivorRatio) 등을 통해 세부 구조를 최적화할 수 있습니다.
⸻
2. 가비지 컬렉션(Garbage Collection)이란?
1. 정의
• 애플리케이션에서 더는 참조되지 않는(사용되지 않는) 객체를 힙에서 자동으로 찾아 제거하고, 그 메모리를 회수하여 재사용 가능한 상태로 만드는 과정입니다.
2. 작동 원리(대표 알고리즘)
1. Mark-and-Sweep (표시-정리)
• Mark 단계: 루트(Root) 참조(스택 변수, 정적 변수 등)로부터 도달 가능한 객체를 “사용 중”으로 표시.
• Sweep 단계: 표시되지 않은(도달 불가능한) 객체를 힙에서 제거.
2. Copying (복사)
• Young Generation에서 주로 사용.
• 살아있는 객체만을 다른 공간으로 복사한 뒤, 이전 공간을 한꺼번에 비움.
3. Generational GC (세대별 수집)
• 객체의 생존 기간 특성을 이용해 Young/Old로 구분해 수집 횟수와 비용을 최적화.
3. 가비지 컬렉션 종류
• Minor GC
• Young Generation만을 대상으로 수행. Eden과 Survivor 사이에서 살아남은 객체들을 복사하고 불필요 객체를 정리합니다.
• Major GC (혹은 Full GC)
• Old Generation 전체(Young + Old)를 대상으로 실행되어, 애플리케이션 일시 중단(pause)이 비교적 깁니다.
4. 주요 GC 구현체 (HotSpot 기준)
Serial GC: 단일 스레드로 동작, 작은 애플리케이션에 적합
Parallel GC (Throughput): 멀티 스레드로 Young/Old 정리, 처리량 우선
CMS (Concurrent Mark–Sweep): Old Generation에서 동시 처리, 일시 중단 시간 최소화
G1 (Garbage-First): 힙을 여러 Region으로 분할, 예측 가능한 일시 중단 시간 제공
• 실행 옵션 예시
-XX:+UseG1GC # G1 GC 사용
-XX:MaxGCPauseMillis=200 # 최대 일시 중단 시간 목표
⸻
3. 요약
• JVM 힙(heap)
: 객체와 배열이 동적으로 할당되는 메모리 공간. Young/Old Generation으로 구분되어 성능 최적화를 돕습니다.
• 가비지 컬렉션(GC)
: 더 이상 사용되지 않는 객체를 찾아 제거하고 메모리를 회수하는 자동화된 메모리 관리 기법. 다양한 알고리즘과 구현체가 있어 애플리케이션 특성에 맞춰 선택·튜닝할 수 있습니다.