본문 바로가기

백엔드 면접준비/Java

6. Garbage Collection(GC)

  • Heap 메모리에서 더 이상 사용되지 않는 객체를 자동으로 제거하는 프로세스.
  • 어플리케이션의 메모리 관리를 자동화하여 메모리 누수를 방지하고 메모리 사용을 최적화 하는 중요한 역할.

Java 힙 메모리 구조(Heap Memory)

Java에서는 Heap 메모리를 관리하며, 이 메모리는 객체를 생성하는 데 사용되는 런타임 메모리 공간이다. Heap 메모리는 크게 Young Generation과 Old Generation으로 나뉜다. 각 영역은 객체 생성, 소멸 및 승격을 관리하는 방식이 다르다.

  • Young Generaion(젊은 세대)
    • 객체가 처음 생성될 때 대부분 Yound Generation에 할당됨
    • Eden 영역에 객체가 할당되고, Eden이 꽉 차면 Minor GC가 발생하여 살아남은 객체는 Survivor 영역으로 이동
    • 여러 번 Survivor 영역을 지나면 객체는 Old Generation으로 승격됨
  • Old Generation(Old 또는 Tenured Generaion)
    • Young Generation에서 승격된 객체들이 저장되는 공간.
    • 이 영역이 가득 차면 Major GC 또는 Full GC가 실행됨.
    • Old Generation은 상대적으로 크기가 크고, GC 발생 빈도가 적음.
  • Metaspace(메타스페이스)
    • 클래스 메타데이터가 저장되는 공간. (Java 8 이후, PermGen이 사라지고 Metaspace로 대체됨)
    • 클래스 로딩 시 메타데이터를 여기에 저장하고, JVM이 동적으로 클래스를 관리해서 메모리 관리의 유연성과 효율성을 향상시킴.

GC 동작과정

GC는 객체를 자동으로 관리하는 중요한 기능이지만, 기본적으로 객체가 더 이상 사용되지 않을 때 메모리에서 제거되어야 한다. GC 동작과정은 크게 Minor GCMajor GC로 나뉜다.

1) Minor GC (Young Generation GC)

  • Young Generation에 있는 객체들이 더 이상 참조되지 않으면 Minor GC가 발생
  • Eden 영역이 가득 차면, GC가 실행되고, Eden 영역에서 살아남은 객체들은 Survivor(S0, S1) 영역으로 이동
  • S0, S1 영역은 서로 교환되며 살아남은 객체를 이동시킴
  • Young Generation에서 객체가 계속 살아남으면, 객체는 Old Generation으로 Promotion(승격)되어 이동

Minor GC의 특징:

  • 짧은 시간에 실행
  • 빠른 처리가 가능하지만 전체 Heap 메모리를 처리하지 않음

2) Major GC (Old Generation GC)

  • Old Generation에 할당된 객체들이 더 이상 참조되지 않으면, Major GC가 발생
  • Old Generation의 객체를 전부 검사하고, 더 이상 사용되지 않는 객체들을 제거
  • Major GC는 Young Generation에서 발생하는 GC보다 더 오래 걸리고, Stop-the-world 현상이 발생하여 애플리케이션이 멈추는 시간이 길어짐.

Major GC의 특징:

  • 긴 시간이 걸릴 수 있으며, 애플리케이션의 일시 정지(Stop-the-world)가 발생함
  • Full GC가 일어나면 전체 Heap을 검사하고 정리

3) Stop-the-World 이벤트

  • Stop-the-World는 GC가 실행되는 동안 애플리케이션이 일시적으로 멈추는 현상
  • 특히 Major GCFull GC에서 발생하며, 애플리케이션의 응답성을 낮출 수 있음.
  • 이를 최소화하기 위해서는 Low Latency GC를 사용하거나, GC를 튜닝해야 함.

GC 동작흐름

  • 객체 생성
    • 객체가 생성되면 Young GenerationEden 영역에 할당됨.
  • Minor GC 발생
    • Eden 영역이 가득 차면, Minor GC가 발생하고, 살아남은 객체들은 Survivor 영역(S0/S1)으로 이동함.
  • 객체 승격
    • Survivor 영역에서 여러 번 살아남은 객체Old Generation으로 승격되어 이동됨.
  • Major GC 발생
    • Old Generation이 가득 차면, Major GC가 발생하고, Old Generation에서 사용되지 않는 객체들을 제거함.
  • Full GC
    • Major GC와 비슷하지만, Young Generation과 Old Generation을 동시에 정리하며, 메타스페이스도 청소됨.
    • Full GC는 시간이 많이 걸리고 애플리케이션 성능에 영향을 미침.

주요 Java 버전별 GC 변화

Java 버전 GC 주요 변화 설명
Java 8 G1 GC 도입 G1 GC가 도입되어 Low-latency와 예측 가능한 일시 정지 시간을 목표로 함.
Java 9 G1 GC 기본 GC로 설정 G1 GC가 기본 GC로 설정되었으며, 성능 개선 및 튜닝 옵션 추가.
Java 11 ZGC와 Shenandoah GC 도입 ZGC와 Shenandoah GC가 도입되어 저지연 성능을 제공함.
Java 12 +  Shenandoah GC와 ZGC 성능 개선 및 기본화 Shenandoah GC와 ZGC의 성능 향상 및 안정성 개선, GC 선택지가 확대됨.

 

G1 GC(Java 8 도입)

  • Low-latency를 목표로 하고, 예측 가능한 일시 정지 시간을 제공.
  • Young GenerationOld Generation부분적으로 병렬 처리.
  • Stop-the-World 시간을 최소화하려고 노력.
  • 대규모 애플리케이션에 적합하고 Java 9부터 기본 GC로 설정됨.

ZGC (Zero, Java 11 도입)

  • 저지연 GC로, Stop-the-World 시간을 매우 짧게 유지.
  • 대규모 시스템에서 메모리 관리가 필요한 경우 유용.
  • Multi-threaded 방식으로 가비지 수집을 처리.
  • Low-latency 환경에 적합, 실시간 애플리케이션에 좋음.

Shenandoah GC (Java 12 도입)

  • 저지연 GCStop-the-World 시간을 최소화.
  • Young GenerationOld Generation을 병렬 처리하면서도 일시 정지 시간이 짧음.
  • ZGC와 유사하지만 성능 및 안정성에 대한 차이가 있음.
  • 대규모 시스템과 실시간 시스템에 적합.

'백엔드 면접준비 > Java' 카테고리의 다른 글