GC

프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 탐지하고 해제하는 메모리 관리 기법입니다.

왜 필요한가?

C/C++: 개발자가 직접 메모리 할당/해제
→ 해제 안 하면 메모리 누수(Memory Leak)
→ 이미 해제된 메모리 접근 시 오류

Java, Python 등: GC가 자동으로 메모리 관리 O

GC 대상 판별 방식

1. Reference Counting

객체를 참조하는 수를 카운팅
→ 카운트가 0이 되면 수거

단점: 순환 참조 시 카운트가 0이 되지 않아 수거 불가
A → B → A (서로 참조)

2. Reachability (도달 가능성) - Java 방식

GC Root에서 시작해 참조를 따라가며 도달 가능한 객체 탐색
→ 도달 불가능한 객체 = 수거 대상

GC Root: 스택 변수, 정적 변수, JNI 참조 등

Java의 GC - 힙 구조

┌─────────────────────────────────────┐
│           Young Generation          │
│  ┌────────┐  ┌────────┬──────────┐  │
│  │  Eden  │  │Survivor│Survivor  │  │
│  │        │  │   S0   │   S1     │  │
│  └────────┘  └────────┴──────────┘  │
├─────────────────────────────────────┤
│           Old Generation            │
└─────────────────────────────────────┘
영역설명
Eden새로 생성된 객체 저장
SurvivorEden에서 살아남은 객체
Old오래 살아남은 객체

GC 동작 과정

1. 객체 생성 → Eden 영역 저장
2. Eden 꽉 참 → Minor GC 발생
3. 살아남은 객체 → Survivor 이동
4. 반복 생존 객체 → Old 영역 이동
5. Old 꽉 참 → Major GC(Full GC) 발생

GC 알고리즘

알고리즘설명특징
Serial GC단일 스레드 수거단순, 소규모 적합
Parallel GC멀티 스레드 수거Java 8 기본값
G1 GC힙을 Region으로 분할Java 9+ 기본값
ZGC초저지연 GCJava 15+

STW (Stop The World)

GC 실행 중 모든 애플리케이션 스레드 중단
→ GC 성능 튜닝의 핵심 목표는 STW 시간 최소화

장단점

장점단점
메모리 누수 방지STW로 인한 일시적 성능 저하
개발 생산성 향상GC 실행 시점 예측 불가
안전한 메모리 관리메모리 즉시 해제 보장 안됨

Java에서는 G1 GC가 기본으로 사용되며, 지연 시간이 중요한 서비스에서는 ZGC 도입을 고려합니다.

CSLOG에서 보기