JAVA - GC
JAVA의 GC에 대하여
자바의 메모리 관리, GC(Garbage Collection) 이해하기
자바는 가비지 컬렉션(GC) 을 통해 메모리 관리를 자동화합니다. 개발자가 직접 메모리를 해제하지 않아도, 더 이상 참조되지 않는 객체를 JVM이 알아서 찾아 회수합니다. C#, Python, Go 등도 같은 방식을 사용합니다.
힙(Heap)의 세대 구조
객체는 JVM의 힙 영역에 저장되는데, 힙은 두 세대로 나뉩니다 — Young Generation 그리고 Old Generation 입니다. "대부분의 객체는 금방 죽는다" 는 경험적 사실에 기반해, 수명이 짧은 객체와 긴 객체를 다르게 취급하기 위해서입니다.
- Young Generation: 새 객체는 Eden에 할당되고, 여기가 가득 차면 Minor GC 가 발생합니다. 살아남은 객체는 Survivor 영역(S0, S1)으로 이동하고 나머지는 해제됩니다. 자주 일어나지만 빠릅니다.
- Old Generation: 여러 번의 GC를 견딘 객체가 승격되는 공간입니다. 여기서 발생하는 GC가 Major GC / Full GC 입니다. 빈도는 낮지만 정지 시간이 길어 성능에 미치는 영향이 큽니다.
객체 하나가 태어나서 승격되기까지의 한 사이클을 애니메이션으로 보면 다음과 같습니다. 초록 객체가 Eden에서 살아남아 Survivor를 오가며 나이를 먹고, age 3이 되는 순간 Old로 승격됩니다.
GC는 어떻게 객체를 회수하는가
GC의 판단 기준은 도달 가능성(Reachability) 입니다. GC 루트(스택의 로컬 변수, static 필드, 활성 스레드 등)에서 출발해 객체 그래프를 탐색하고, 도달할 수 없는 객체를 회수합니다.
동작은 크게 세 단계입니다.
- 마크(Mark): 도달 가능한 객체를 표시
- 스위프(Sweep): 표시되지 않은 객체를 해제
- 컴팩트(Compact): 단편화를 줄이기 위해 객체를 재배치 (알고리즘에 따라 생략)
위 그림의 D↔E처럼 객체가 서로를 참조하는 순환 참조 관계라도, 외부(GC 루트)에서 도달할 수 없다면 둘 다 정상적으로 회수됩니다.
참조 유형
GC와의 상호작용 강도에 따라 네 가지 참조가 있습니다. 회수되기 쉬운 순서로 보면:
- 강한 참조(Strong):
MyObject obj = new MyObject();— 참조가 유지되는 한 절대 회수되지 않습니다. - 소프트 참조(Soft): 메모리가 부족할 때만 회수됩니다. 캐시에 적합합니다.
- 약한 참조(Weak): 강한 참조가 없으면 다음 GC 때 언제든 회수됩니다.
WeakHashMap이 대표적인 활용처입니다. - 팬텀 참조(Phantom): 객체가 회수된 "후"의 리소스 정리 작업에 사용되는 특수한 참조입니다.
주요 GC 알고리즘과 선택 기준
| GC | 특징 | 적합한 곳 |
|---|---|---|
| Serial GC | 단일 스레드, 단순 | 작은 힙, 싱글 코어 |
| Parallel GC | 병렬 처리로 처리량 극대화 | 배치성 애플리케이션 |
| G1 GC | 힙을 리전으로 나눠 관리, 예측 가능한 정지 시간. Java 9부터 기본 | 일반적인 웹 애플리케이션 |
| ZGC / Shenandoah | 밀리초 이하의 초저지연, 초대형 힙 지원 | 게임, 실시간 시스템 |
CMS GC는 과거 저지연 용도로 쓰였지만 Java 14에서 제거되었으므로, G1이나 ZGC로 전환해야 합니다.
GC 로그 읽기
-Xlog:gc 옵션으로 GC 로그를 확인할 수 있습니다.
[gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 512M->256M(1024M) 15.123ms
512M->256M(1024M)은 "GC 전 사용량 → GC 후 사용량 (전체 힙)", 마지막 숫자는 정지 시간입니다. Full GC가 자주 보이거나 정지 시간이 길다면 힙 크기나 GC 알고리즘을 점검할 신호입니다.
마치며
GC 덕분에 개발자는 메모리 관리 부담에서 벗어나지만, 동작 원리를 알아야 성능 문제에 제대로 대응할 수 있습니다. 애플리케이션이 처리량 중심인지 지연 시간 중심인지에 따라 GC를 선택하고, 로그로 실제 동작을 확인하며 튜닝하는 것이 기본입니다.