[JAVA] Garbage Collection

1. GC 개념

  • Garbage Collection(가비지 컬렉션)
  • 더이상 참조되지 않는 객체를 힙 메모리에서 제거하여 메모리를 확보하는 기능
  • 메모리 누수 방지

2. 동작 방식

1) 시점

  • 주기X, JVM 판단으로 실행
    • 판단 근거
      • 메모리 부족
      • 시스템 idle(CPU 사용률이 낮은 상태)
      • 객체 수 급증
  • 명시적 호출이 가능하나 보장X
    • System.gc();

2) 제거 조건

  • 참조 해제된 객체
    • null값을 가진 객체
    • 스코프를 벗어난 지역변수

✔︎ 객체 생존 기간에 따른 힙 메모리 구조

  • JVM마다 GC 정책에 따라 다른 구조를 가짐
    • HotSpot JVM(대부분의 자바 배포판) 메모리 구조
      Heap
       ├─ Young Gen (Eden, Survivor0, Survivor1)
       │      └─ Minor GC
       └─ Old Gen
          └─ Major GC
      
(1) Young Generation
  • 새로운 객체 생성 시 저장되는 메모리 구역
  • Minor GC 활동 영역
    • Minor GC: Young Gen에서만 수행
  • GC 실행 빈도 多
  • 생성 시점에 따라 세부적으로 구역 분리
    • 오래될 수록 다음 영역으로 이동(메모리 주소 변경 가능)
(2) Old Generation
  • Young Gen에서 승격(Promotion)된 객체 저장 메모리 구역
    • Old Gen에 복사 & 참조 변수가 새 주소로 업데이트
  • Major GC(Full GC)
    • Major GC: 전 영역에 대해 수행
  • GC 실행 빈도 少
  • GC의 성능 부담이 큼

3) 실행 단계

(1) Stop The World

  • JVM이 GC 전용 스레드 외 애플리케이션의 모든 스레드를 일시정지
  • Heap 메모리를 안전하게 정리

(2) Mark and Sweep

  • Mark: 참조되는 객체 식별
  • Seep: 미참조 객체 제거 & 메모리 회수

4) GC 알고리즘

  • JVM이 자동으로 선택: 실행 환경, Heap 크기, CPU 코어 수 등을 기반
  • 사용자가 옵션으로 직접 지정 가능
  • 알고리즘 종류
    • Serial GC
      • 단일 스레드 → 작은 Heap에서 Young/Old 영역 모두 수행
    • Parallel GC
      • 멀티 스레드 → Young Gen 병렬처리
    • CMS (Concurrent Mark Sweep)
      • Old Gen GC를 애플리케이션과 병행 수행 → Stop-The-World 최소화
    • G1 GC
      • Young/Old 병행 관리 → 대형 Heap 환경 최적화

Categories:

Updated:

Leave a comment