Garbage Collector :
。사용하지않는 HEAP 영역 상의 자바 객체를 JVM에 의해 자동으로 메모리 해제하는 기능
▶ STACK 영역의 변수는 메서드 호출이 끝난 경우 자동으로 메모리 해제되지만 HEAP 영역의 객체는 언제까지 사용되는지 예측이 어려우므로 GC에 의해 해제
。사용하지 않는 Class 객체의 경우 객체=null;로 설정하여 참조 해제된 이후 GC에 의해 참조되어 JVM이 메모리 해제를 수행
▶ 개발자가 메모리 해제를 수행하지 않아도 GC에 의해 자동으로 수행
。HEAP 영역에 존재하는 자바 객체 중 더 이상 참조되지 않는 자바객체를 정리대상으로 판단
▶ JVM의 Garbage 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 Generation의 Eden 영역에 위치
- 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의 최소화가 중요
참고
인프런 - 말이 트이는 자바와 객체지향