Garbage Collection 정리

Garbage Collection 정리

Posted on 2018-05-12

GC 용어

GC (Garbage Collection)

  • Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능

STW (Stop-The-World)

  • GC가 메모리 정리를 위해서 어플리케이션의 실행을 중지시키는 행위
  • GC 튜닝을 한다면 이 시간을 줄여야 함

OOM (Out Of Memory)

  • Heap 메모리 부족 시 발생되는 에러 상황 및 메시지

Mark

  • Object가 현재 사용되고 있는지에 대한 검사
  • Referrer가 존재하는지 확인하는 것으로 Minor GC 단계에서 주로 수행됨

Sweep

  • Mark 대상에 대해서 회수 작업 (메모리상에 미사용으로 처리)
  • Minor GC 단계에서 주로 수행됨

Compact

  • 디스크 조각모음 하듯이 메모리 공간 확보 Major GC 단계에서 수행됨

GC 과정

Java에서는 개발자가 메모리를 명시적으로 해제하지 않는다. 대신에 Garbage Collector 가 더 이상 필요 없는 객체를 찾아 지우는 작업을 한다. 이 가비지 컬렉터는 두 가지 가설 전제 하에 만들어졌다.

  • Weak Generational Hypothesis
    1. 대부분의 객체는 금방 접근 불가능 상태가 된다. 할당되고 짧은 시간 내에 사용이 종료되어 불필요한 상태인 것이 거의 대부분이다.
    2. 오래된 객체에서 젊은 객체로의 참조는 거의 발생하지 않는다.

이 가설의 장점을 최대한 살리기 위해서 메모리를 몇가지 영역으로 분리하여 관리하는 것이 효과적이다.

JVM Memory 영역

JVM Memory

  • Young : 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • Old : 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
  • Perm : Method 영역이라고도 부른다. Class, Method 등 메타 데이터가 저장된다.

GC 종류

  • Minor GC : Young 영역에서 발생하는 GC
  • Major(Full) GC : Old 영역에서 발생하는 GC

GC 발생 과정

  1. 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
  2. Eden 영역이 가득 차 Minor GC가 발생하면 살아남은 객체가 Survivor 영역 중 하나로 이동해서 Age가 증가한다.
  3. 다시 Eden 영역이 가득 차 Minor GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 이동해서 Age가 증가한다.
  4. 그 Survivor 영역이 가득 차면 그 중에서 살아남은 객체가 다른 Survivor 영역으로 이동해서 Age가 증가한다.
  5. 1~4 과정을 반복하다가 계속해서 살아남은 객체의 Age가 threshold 설정 값(default 16)이 되면 Old 영역으로 이동한다.
  6. 1~5 과정을 반복하다가 Old 영역이 가득 차면 Major GC가 발생한다.

이 절차를 확인해 보면 두개의 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 Survivor 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아니라고 생각하면 된다.


GC 방식

  • Serial GC
  • Parallel GC
  • Parallel Compacting GC
  • Concurrent Mark Sweep GC
  • G1(Garbage First) GC

Java 버전별 GC 방식 default value

  • Java 7 > Parallel GC
  • Java 8 > Parallel GC
  • Java 9 > G1 GC

상세 내용은 잘 설명되어 있는 링크로 대체합니다.


Reference