GC(Garbage Collection)

Sixhustle·2021년 10월 18일
0

Java

목록 보기
7/10

Garbage Collection

더 이상 사용하지 않는 객체를 청소하여 Heap 메모리 공간을 확보하는 기능

GC는 weak generational hypothesis라는 가설을 기반으로 만들어졌다고 합니다.

  1. 대부분 객체는 금방 접근 불가능한(unreachabel) 상태가 된다.
  2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생한다.

Heap 구조

Perm

Java 8 부터는 Metaspace로 변경

Young 영역(Minor GC발생)

  1. 새롭게 생성된 객체가 할당되는 영역
  2. 대부분의 객체가 금방 Unreachable상태가 되기 때문에, 많은 객체가 Young 영역에서 생성되었다가 사라짐
  3. Young 영역에 대한 GC를 Minor GC라 부름

Old 영역

  1. Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  2. 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 GC는 적게 발생
  3. Old 영역에 대한 GC를 Major GC라 부름

동작 방식

GC는 아래 2가지 원리를 기반으로 동작합니다.

1. Stop The World

GC를 실행하는 thread 제외한 모든 thread의 작업을 중단 시키는 것

2. Mark and Sweep

  1. Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
  2. Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

Minor GC

Young 영역은 1개의 Eden2개의 Survivor 영역으로 되어 있습니다.

  1. Eden : 새로 생성된 객체가 할당(Allocation)되는 영역
  2. Survivor : 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역

순서

  1. 새로운 객체는 Eden에 할당
  2. Eden 영역이 꽉 차면 Minor GC 발생
    1. Eden 영역에서 사용되지 않는 메모리 해제
    2. 사용되는 객체는 Survivor 영역으로 이동
  3. 1~2번의 과정을 반복. Survivor 영역이 가득차면 다른 Survivor 영역으로 이동
    1. Survivor 영역 중 1개는 반드시 사용되어야 한다.
    2. 두 Survivor 영역에 모두 데이터가 존재하거나 모두 사용량이 0이면 시스템이 비정상적인 상황
  4. 위 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동(promotion)
    1. minor gc에서 살아남은 횟수를 의미하는 age를 object header에 기록
    2. age를 보고 promotion 여부를 결정

Major GC

객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생


References

0개의 댓글