가비지 컬렉션

민선규·2023년 3월 22일
0

JAVA

목록 보기
10/25
post-thumbnail

가비지 컬렉션

가비지 컬렉션은 불필요한 메모리를 정리를 해주는 프로세스로 알고 있다. 이번에는 가비지 컬렉션에 대해 더 자세히 알아보고 정리를 해보았다.

가비지 컬렉션의 단점

  • 메모리가 언제 해제되는지 정확하게 알 수 없다.
  • 가비지 컬렉션이 동작하는 동안에 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

Stop-The-World

  • GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상을 의미.
  • GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있다.

가비지 컬렉션의 대상

객체들은 실질적으로 Heap영역에서 생성되고 Method Area이나 Stack Area 에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. Heap에 있는 객체에 참조가 있으면 Reachable 참조가 없으면 Unreachable로 구분을 하고 가비지 컬렉션은 Unreachable된 객체를 정리한다.

  • Reachable : 객체가 참조되고 있는 상태
  • Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)

Mark and Sweep 알고리즘

Mark

가비지 컬렉션에는 GC Root가 존재한다. 루트로 부터 그래프를 순회하여 연결된 객체들을 찾아내어 각각 어떤 객체를 잠조하고 있는지 찾아서 마킹한다.

GC Root는 Heap 메모리 영역을 참조하는 method area, static 변수, stack, native method stack이 되게 된다.

Sweep

Unreachable 객체들을 모두 제거한다.

Compact

Sweep 후에 흩어져있는 객체들을 Heap의 시작 주소로 모아 정렬한다.(가비지 컬렉터 종류에 따라 하지 않는 경우도 있음)

가비지 컬렉션의 동작과정

Heap의 구조

heap영역은 크게 Young Generation와 Old Generation으로 이루어져 있다. 이는 메모리를 효율적으로 관리하기 위해서이다.

Heap 설계의 두 가지 전제

  • 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
  • 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다

Young Generation은 새롭게 생성된 객체가 할당되는 영역으로 이 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다

Old Generation은 Young Generatio에서 살아남은 객체가 복사되는 영역으로 Young Generatio영역 보다 크게 할당이 되어지며 이 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.

Young Generation의 구조

Young Generation 영역은 Eden, survivor 0, survivor 1 로 나누어진다.

Eden

  • 새롭게 생성된 객체가 위치하는 영역
  • 이 영역에서 살아남은 객체는 survivor영역으로 이동

survivor 0, survivor 1

  • 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
  • Survivor 영역에는 특별한 규칙이 있는데, Survivor 0 또는 Survivor 1 둘 중 하나는 꼭 비어 있어야 한다.

Minor GC 과정

Young Generation의 공간은 Old Generation에 비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸린다.

  1. 새롭게 생성된 객체는 Eden 영역에 위치한다.
  2. Eden 영역이 가득 차게 되면 Minor GC가 실행된다.
  3. Mark 동작을 통해 Reachable를 찾는다.
  4. 찾은 Reachable 객체를 survivor 0으로 이동시킨다.
  5. Eden 영역을 Sweep한다.
  6. 살아남아 이동시킨 객체에 age를 ++한다.
  7. 다시 den 영역이 가득 차게 되면 Minor GC가 실행된다.
  8. Mark 동작을 통해 Reachable를 찾는다.
  9. 찾은 Reachable 객체를 survivor 1으로 이동시킨다.
  10. 살아남아 이동시킨 객체에 age를 ++한다.
    을 반복한다.

age

살아남은 객체에 age를 계속 증가시키고 있는데 age 값을 기준으로 Young Generation 영역에서 Old Generation 영역으로 이동을 시킨다. VM 중 가장 일반적인 HotSpot JVM의 경우 이 age의 기본 임계값은 31이다.

Major GC 과정

Major GC는 Old Generation에 데이터가 가득 차면 GC를 실행하는 단순한 방식이다.
Major GC가 실행되면 Old Generation 영역에 있는 Mark and Sweep 과정을 거치게 된다.

Old Generation은 Young Generation에 비해 상대적으로 큰 공간을 가지고 있어, 이 공간에서 메모리 상의 객체 제거에 많은 시간이 걸리게 된다.

여기서 Stop-The-World 문제가 발생되는 이러한 문제를 해결하기 위해 가비지 컬렉션 알고리즘을 발전 시켜왔다. 다음에는 가비지 컬렉션 알고리즘에 대해서 정리를 해보겠다.

참고 문서 및 링크

0개의 댓글

관련 채용 정보