Java - Garbage Collector

TopOfTheHead·2025년 12월 11일

자바 ( JAVA )

목록 보기
20/23

Garbage Collector :
。사용하지않는 HEAP 영역 상의 자바 객체JVM에 의해 자동으로 메모리 해제하는 기능
STACK 영역변수메서드 호출이 끝난 경우 자동으로 메모리 해제되지만 HEAP 영역객체는 언제까지 사용되는지 예측이 어려우므로 GC에 의해 해제

。사용하지 않는 Class 객체의 경우 객체=null;로 설정하여 참조 해제된 이후 GC에 의해 참조되어 JVM메모리 해제를 수행
개발자메모리 해제를 수행하지 않아도 GC에 의해 자동으로 수행

HEAP 영역에 존재하는 자바 객체더 이상 참조되지 않는 자바객체를 정리대상으로 판단
JVMGarbage Collector에 의해 GC ( Garbage Collection )이 발생하여 메모리를 자동으로 해지

  • Garbage Collection 대상 자바객체 판단 기준
    Root 객체부터 시작하여 참조가능한 객체를 추적 및 더이상 Root객체에 의해 참조되지 않는 자바객체Garbage로 판단하여 GC를 수행

    위 그림에서 E, F는 더이상 Root 객체에 의해 참조되지 않으므로 GC 대상이 된다.

    Root Object 예시
    Thread Stack에 존재하는 지역 변수 ( ex. 메서드 내부 변수, 매개변수 등 )

    Method Area에 저장된 static 변수

    Native Method Stack에서 참조 중인 자바 객체

Garbage Collection 동작 구분

  • Stop-the-World
    Garbage Collector에 의해 GC가 실행 시 JVM에 의해 어플리케이션 실행을 중단하는 현상
    GC가 완료될 때까지 모든 실행중인 스레드가 중단되어 대기

    Stop-the-World 소요시간이 길어질 경우 어플리케이션 성능에 악영향
    Major GC에서 HEAP 영역 전체 스캔에 따른 GC 소요시간 증가에 따라 Stop-the-World의 소요시간이 길어지므로 GC 튜닝을 통해 Major GC의 발생빈도를 감소시켜야한다.

  • Mark and Sweep
    GC의 기본 동작 방식으로서 참조되지않는 자바 객체를 식별 및 제거하는 과정

GC 기본 동작 과정
HEAP 메모리 영역GC가 수행되는 과정

  • 1. 자바 객체 생성
    new 키워드HEAP 영역에서 자바 객체 생성 시 Young GenerationEden 영역에 위치

  • 2. Mark 단계
    자바 객체의 생존여부 확인

    자바객체와 사용되지않는 자바객체를 구분하는단계
    ▶ 참조가 확인되지 않는 자바객체GC대상으로 확인

  • 3. Sweep 단계
    。더 이상 참조되지않아 사용되지않는 자바객체에 대해 GC를 수행하여 메모리 해제메모리 회수

  • 4. Compaction 단계
    자바객체GC한 후 남은 자바객체를 압축하여 메모리 단편화 방지

HEAP 영역자바객체Life Cycle

  • 1. 초기 Eden 영역에서 자바객체 생성
    어플리케이션new자바객체를 생성하는 경우 Eden 영역에서 생성.

  • 2. Minor GC 수행 및 Survivor 영역 내 이동
    Eden 영역이 꽉찬 경우 Minor GC가 발생
    Eden 영역자바객체가 적체되어 Minor GC가 발생 시마다 반복

    。생존한 자바객체S0 or S1영역으로 복사 및 이동
    ▶ 죽은 자바객체의 경우 메모리 해제

    。기존 Survivor 영역 내 남아있는 자바객체들은 다른 Survivor 영역으로 복사 및 이동 ( S0 <-> S1 )
    자바객체의 복사가 수행될때마다 해당 자바객체age값( = 생존횟수 )이 증가

  • 3. Old Generation으로 Promotion
    Survivor 영역자바객체age값특정 임계값에 도달하는 경우 Old Generation으로 승격( Promotion )되어 Major GC의 대상이 됨.

HEAP 영역 구분

  • Young Generation :
    Minor GC가 수행되는 HEAP 영역

    Eden 영역, Survivor 영역 ( S0 , S1 )으로 구성

  • Old Generation
    Major GC가 수행되는 HEAP 영역

    HEAP 영역을 구분하는 이유

    • 자주 사용하는 자바객체에 대해서만 Old Generation 영역으로 이동하여 GC의 부하를 감소
      。대부분의 자바객체는 생성 후 다시 사용되는 경우의 빈도가 매우 적으므로 Minor GC에 의해 주기적으로 청소
      ▶ 자주 사용되는 자바객체에 대해서만 Old Generation 영역으로 Promotion하여 Young Generation 영역에서 제외

Garbage Collection 종류

  • Minor GC
    Young Generation에서 발생하는 GC

    Young Generation에 해당하는 HEAP 영역에 한정해서 스캔하므로 빠르게 실행되며 Stop-the-World 시간이 짧음.

  • Major GC
    Old Generation에서 발생하는 GC

    HEAP 영역 전체를 검사하므로 실행시간이 길어 Stop-the-World 소요시간이 길어지므로 Minor GC에 비해 성능에 악영향을 부여
    GC 튜닝을 통해 Major GC의 최소화가 중요

참고
인프런 - 말이 트이는 자바와 객체지향

profile
공부기록 블로그

0개의 댓글