반응형
1. JVM Garbage Collection(GC)이란?
Garbage Collection(GC)은 자바의 메모리 관리 기법 중 하나로, 힙(Heap) 영역에서 더 이상 참조되지 않는 객체들을 찾아 메모리에서 해제하는 과정을 의미합니다. C나 C++ 과 달리 개발자가 직접 메모리를 해제할 필요가 없으며, JVM이 자동으로 관리해줍니다.
GC의 장점
- 메모리 누수 방지: 프로그래머의 실수로 인한 메모리 누수를 자동으로 방지
- 개발 생산성 향상: 메모리 관리에 신경 쓰지 않고 비즈니스 로직에만 집중
- 안정성 보장: 메모리 부족으로 인한 프로그램 정지 위험을 감소
GC의 단점
- GC 중단시간(Stop-The-World): GC 실행 중 모든 애플리케이션 스레드가 중단
- 성능 저하: GC로 인한 CPU 사용률 증가
- 예측 불가능성: GC 발생 시점을 미리 예측하기 어려움
2. JVM 힙 메모리 구조
JVM의 힙 영역은 객체의 생존 기간에 따라 크게 Young Generation과 Old Generation으로 나뉩니다.
┌─────────────────────────────────────────────────┐
│ JVM Heap 메모리 │
├─────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────┐ ┌───────────────┐ │
│ │ Young Generation │ │ Old │ │
│ │ (Young Gen) │ │ Generation │ │
│ │ │ │ (Old Gen) │ │
│ │ ┌────────┐ ┌────────┐│ │ │ │
│ │ │ Eden │ │Survivor││ │ │ │
│ │ │Space │ │Spaces ││ │ │ │
│ │ │ │ │S0 / S1 ││ │ │ │
│ │ └────────┘ └────────┘│ │ │ │
│ └──────────────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────┘
Young Generation (Young Gen)
- 새로 생성된 객체들이 할당되는 영역
- 전체 힙의 약 10-30% 차지
- 대부분의 객체가 이 영역에서 사라짐
- 세 개의 하위 영역으로 구성:
- Eden Space: 새로운 객체가 생성되는 공간
- Survivor Space 0 (S0): 첫 번째 생존자 영역
- Survivor Space 1 (S1): 두 번째 생존자 영역
Old Generation (Old Gen)
- Young Gen에서 오래 생존한 객체들이 이동하는 영역
- 전체 힙의 약 60-90% 차지
- GC가 덜 빈번하게 실행됨
3. Minor GC vs Major GC

GC는 발생하는 영역에 따라 크게 두 가지로 구분됩니다.
Minor GC
- 발생 지점: Young Generation
- 특징:
- 객체가 처음 생성되는 Eden 영역이 꽉 차면 발생합니다.
- 상대적으로 속도가 매우 빠릅니다.
- 살아남은 객체는 Survivor 영역으로 이동하며, 이 과정을 반복하며 생존 기간을 기록합니다.
Major GC (Full GC)
- 발생 지점: Old Generation
- 특징:
- Old 영역의 메모리가 부족해지면 발생합니다.
- Minor GC보다 훨씬 오래 걸립니다.
- Stop-the-world 현상이 발생하여, GC를 실행하는 스레드를 제외한 모든 애플리케이션 스레드가 중단됩니다.
4. Minor 영역에서 Major 영역으로의 승격(Promotion)
객체가 Young Generation에서 Old Generation으로 옮겨가는 과정을 Promotion(승격)이라고 부릅니다. 이 과정은 어떻게 결정될까요?
- Age bit의 누적: Young 영역의 Survivor 공간에서 객체가 살아남을 때마다 객체 헤더의 age 값이 1씩 증가합니다.
- 새로운 객체 생성:
├─ Eden Space (Age: 0) - 1차 Minor GC 후:
├─ Survivor S0 (Age: 1) ← 살아남은 객체 - 2차 Minor GC 후:
├─ Survivor S1 (Age: 2) ← S0에서 생존한 객체 - 3차 Minor GC 후:
├─ Survivor S0 (Age: 3) ← S1에서 생존한 객체
... - Age >= Threshold (보통 15)에서:
├─ Old Generation ← 승격!
- 새로운 객체 생성:
- MaxTenuringThreshold: JVM은 이 age 값이 특정 기준(Threshold)에 도달하면 해당 객체가 "오래 살아남을 객체"라고 판단합니다.
- 이동: 기준치를 넘긴 객체는 비로소 Old Generation으로 복사(Promotion)됩니다.
참고: 너무 큰 객체가 생성되어 Eden 영역에 담기지 않을 경우, 바로 Old 영역으로 할당되기도 합니다.
5. 결론
GC가 자동으로 메모리를 관리해 주지만, Major GC가 빈번하게 발생하거나 길어지면 서비스 응답 속도가 떨어지는 성능 저하를 초래합니다. 따라서 적절한 힙 크기 설정과 서비스 특성에 맞는 GC 알고리즘(G1, ZGC 등) 선택이 중요합니다.
반응형
'Back end > Java' 카테고리의 다른 글
| [Java] JDBC의 Statement와 PreparedStatement (2) | 2026.01.22 |
|---|---|
| AtomicInteger는 어떻게 동시성을 보장할까? - CAS 알고리즘 깊이 파헤치기 (0) | 2026.01.14 |
| [Java] static import 활용법 (0) | 2025.07.07 |
| [Java] 자바 데이터 타입 (기본형, 참조형) (0) | 2025.05.27 |
| [Java] 상수(Constant) (0) | 2025.05.26 |