자바의 GC(Garbage Collection)
- JVM이 힙 메모리 상에서 더 이상 사용되지 않는 객체를 자동으로 제거하는 기능
- GC의 대상이 되는 객체를 판단하기 위해 JVM은 도달 가능성(Reachability) 을 확인
JVM 메모리 구조
📦 JVM 메모리 구조
┌────────────────────┐
│ 메서드(Method) 영역 ─ 클래스 정보, static 변수 등 │
└────────────────────┘
▲
│
┌────────────────────┐
│ 스택(Stack) ─ 지역 변수, 메서드 호출 정보 │
└────────────────────┘
▲
│
┌────────────────────┐
│ 힙(Heap) ─ 객체들이 생성되는 공간 │
└────────────────────┘
GC 대상 판단 기준: 도달 가능성
- JVM은 GC 수행 시 특정 객체에 여전히 접근할 수 있는지를 기준으로 살아있는 객체와 제거할 객체를 판단
- GC의 시작점은 Root Set / 아래 3가지를 포함한다
- 스택 영역에 존재하는 지역 변수
- static 변수
- JNI를 통해 참조되는 객체
- GC 판단 과정
- Root Set으로부터 참조를 따라가며 도달할 수 있는 객체는 사용 중인 객체로 간주
- 이 경로에서 벗어난 객체는 더 이상 사용되지 않는 것으로 판단하고 GC 대상이 된다.
# GC 판단 과정
Root Set
│
┌───────────┼────────────┐
▼ ▼ ▼
Stack Static Native
Frame Field Method
│ │ │
▼ ▼ ▼
[A] ───▶ [B] ───▶ [C] [D]
[X] ← 도달 불가 → GC 대상!
# Root Set에서 참조되는 A → B → C는 도달 가능하므로 GC 대상 아님
# X는 어떤 참조도 받지 않으므로 GC 대상
개발자가 GC에 관여할 수 있는 방법
- 자바는 java.lang.ref 패키지를 통해 개발자가 GC 대상 판단에 일부 관여할 수 있는 기능을 제공
- SoftReference와 WeakReference
- SoftReference
- 메모리가 충분하면 수집되지 않음
- 메모리가 부족할 경우 GC 대상이 됨
- 캐시 구현 등에 사용
SoftReference<Data> sr = new SoftReference<>(new Data());
- WeakReference
- 참조가 없다면 즉시 GC 대상이 됨
- 메모리 누수 방지에 적합
WeakReference<Data> wr = new WeakReference<>(new Data());