JVM의 가비지 컬렉션은 어떤 기준으로 객체를 회수하나요?
답변 포인트
도달 가능성 분석과 세대별 가설를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
JVM GC는 GC Root에서 도달할 수 없는 객체를 회수합니다. 세대별 가설을 활용해 Young/Old 영역을 나누고, 처리량과 지연 시간 목표에 따라 GC 방식을 선택합니다.
JVM GC는 GC Root에서 도달할 수 없는 객체를 회수합니다. 세대별 가설을 활용해 Young/Old 영역을 나누고, 처리량과 지연 시간 목표에 따라 GC 방식을 선택합니다.
핵심 개념
핵심 기준은 도달 가능성 분석과 세대별 가설입니다.
JVM은 “더 이상 사용하지 않는 것처럼 보이는 객체”가 아니라 GC Root에서 참조 그래프를 따라갔을 때 도달할 수 없는 객체를 회수합니다. GC Root에는 스레드 스택의 지역 변수, static 필드, JNI 참조 등이 포함됩니다.
대부분의 객체는 짧게 살고 일부 객체만 오래 산다는 세대별 가설에 따라 Young/Old 영역을 나눠 관리합니다. Young GC는 자주 빠르게 일어나고, Old 영역 수집은 더 큰 pause를 만들 수 있어 애플리케이션의 지연 시간 요구에 맞는 GC 선택과 관찰이 필요합니다.
동작 흐름
- GC Root에서 출발해 객체 그래프의 도달 가능성을 판단합니다.
- Young 영역에서 살아남은 객체는 조건에 따라 Old 영역으로 승격됩니다.
- GC 알고리즘은 처리량, pause time, heap 크기 목표에 맞게 선택합니다.
- 운영에서는 GC 로그, heap dump, allocation rate를 함께 분석합니다.
실제 예시
public class MemoryExample {
private static final List<Object> cache = new ArrayList<>();
public static void main(String[] args) {
Object temp = new Object();
temp = null; // 도달 불가능하면 GC 대상
cache.add(new byte[1024 * 1024]); // static 참조가 남아 회수되지 않음
}
}예시는 핵심 구조를 단순화한 것입니다. 실무에서는 운영 환경, 장애 상황, 보안 요구사항에 맞게 세부 설정을 조정해야 합니다.
실무에서 주의할 점
- 참조가 남은 캐시나 static 컬렉션은 사용하지 않아도 메모리를 붙잡을 수 있습니다.
- GC 튜닝보다 객체 생성 패턴, 컬렉션 크기, I/O 병목이 더 큰 원인일 수 있습니다.
- 평균 pause만 보지 말고 p99 지연 시간과 Full GC 발생 여부를 확인해야 합니다.
함께 연결해서 보면 좋은 키워드
Java, JVM, GC, Memory
면접에서 짚으면 좋은 포인트
- GC가 자동 메모리 관리라는 점과, 참조가 남아 있으면 회수하지 못한다는 점을 함께 설명하면 좋습니다.
- 운영 문제 분석에서는 GC 로그와 heap dump를 어떤 질문으로 볼지 말하면 답변이 깊어집니다.
정리
한 줄로 정리하면, JVM GC는 GC Root에서 도달할 수 없는 객체를 회수합니다. 세대별 가설을 활용해 Young/Old 영역을 나누고, 처리량과 지연 시간 목표에 따라 GC 방식을 선택합니다. 개념의 정의뿐 아니라 장애 시 동작, 운영 지표, 자동화와 복구 전략까지 함께 이해하는 것이 중요합니다.