프로그래밍 언어/JAVA

Java GC(Garbage Collection) 기초 개념 정리

코딩금융치료 2025. 8. 7. 10:53

Java에서의 메모리 관리는 자동으로 이루어지며, 그 중심에는 Garbage Collector(GC)가 있습니다. 이번 글에서는 GC의 기본 원리와 각 영역의 역할, 그리고 객체가 살아가는 흐름에 대해 정리합니다.

 

1. GC란 무엇인가?

GC(Garbage Collection)는 프로그램 실행 중 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하여, 메모리를 효율적으로 관리하는 JVM의 기능입니다. Java에서는 개발자가 명시적으로 메모리를 해제하지 않아도 GC가 이를 대신해줍니다.

 

2. JVM 메모리 구조와 GC 관련 영역

JVM의 힙(Heap)은 다음과 같이 나뉩니다:

  • Young Generation
    • Eden 영역: 새로 생성된 객체들이 저장됨
    • Survivor 영역(S0, S1): Eden에서 살아남은 객체들이 이동하는 공간
  • Old Generation
    • 여러 번의 GC를 견디고 살아남은 객체가 승격(promote)되어 저장됨
  • Metaspace
    • 클래스 메타데이터가 저장되는 공간 (JDK 8부터 PermGen을 대체)

3. GC의 동작 원리

(1) 객체 생성과 Minor GC

  • 새로 생성된 객체는 Eden 영역에 저장됩니다.
  • Eden이 가득 차면 Minor GC가 발생하여,
    • GC Root에서 참조되지 않는 객체는 제거되고,
    • 살아남은 객체는 Survivor 영역으로 이동합니다.
  • 이 과정을 거치며 객체는 age(생존 횟수) 를 증가시키게 됩니다.

(2) Survivor → Old 영역으로의 승격

  • Survivor 영역에 있던 객체가 여러 번의 Minor GC에서도 살아남으면,
    → 일정 age 이상일 경우 Old 영역으로 승격됩니다.
  • Old 영역은 장기적으로 참조되는 객체들이 모이는 곳입니다.

(3) Full GC

  • Old 영역이 가득 차거나,
  • System.gc()와 같은 명시적 호출이 있거나,
  • Metaspace가 부족해질 경우

Full GC가 발생하여 Young, Old, Metaspace 영역까지 모두 GC의 대상이 됩니다.

 

4. GC Root와 객체 생존 여부

GC는 단순히 "얼마나 오래 있었는가"를 기준으로 객체를 제거하지 않습니다.
대신 GC Root에서 참조 가능한지(Reachable) 여부를 기준으로 객체 생존 여부를 판단합니다.

대표적인 GC Root 예시:

  • 현재 실행 중인 쓰레드의 스택 프레임 (지역 변수 등)
  • static 변수
  • JNI(Global references)

5. 정리된 객체의 생존 흐름 요약

Eden → Survivor → Old
  • Eden에 생성된 객체 중 GC Root에서 참조되지 않는 객체는 GC에 의해 제거
  • 살아남은 객체는 Survivor로 이동하고 age 증가
  • age가 기준 이상이면 Old 영역으로 승격
  • Old 영역이 가득 차면 Full GC 발생 가능

마무리

Java의 GC는 매우 똑똑하게 설계되어 있지만, 정확히 이해하고 있어야 성능 병목을 줄이고, 적절한 튜닝도 가능해집니다. 이번 글에서는 기본적인 흐름만 정리했지만, 이후에는 다양한 GC 알고리즘(Serial, Parallel, G1 등)과 튜닝 방법까지 확장해볼 수 있습니다.

 

 

이 포스트는 Java GC 개념을 정리하고 싶을 때 참고하기 위한 목적으로 작성되었습니다.
필요하신 분들께 도움이 되기를 바랍니다.