Garbage Collection

ejoo·2024년 4월 15일

Garbage Collection

프로그램에서 더 이상 사용되지 않는 객체가 차지하고 있는 메모리를 자동으로 회수하여, 메모리 누수를 방지하고 프로그램 실행 중 메모리 부족 문제를 줄이는 자동 메모리 관리 형태.

GC의 작동 원리

힙(heap)에 할당된 객체들을 추적하고 어떤 객체들이 더 이상 사용되지 않는지를 판단
다음과 같은 과정을 통해 가비지 컬렉터가 메모리를 관리한다:
객체 추적 및 접근 가능성 분석: 모든 객체에 대한 참조를 추적하고, 루트 집합(root set)에서 접근 가능한 객체를 파악한다. 루트 집합은 스택, 글로벌 변수, 레지스터 등에서 참조되는 객체들로 구성
접근 불가능한 객체 식별: 프로그램에서 더 이상 접근할 수 없는 객체들을 식별. 이 객체들은 메모리에서 해제될 수 있다.
메모리 회수: 접근할 수 없는 객체가 사용하고 있던 메모리를 회수하고, 필요에 따라 메모리 조각 모음(Compaction)을 수행하여 메모리 사용을 최적화

GC의 필요성

프로그램이 동적으로 할당 했던 메모리 영역(HEAP) 중 필요 없게 된 영역을 알아서 해제
➕메모리 누수 방지
➕해제된 메모리 접근 방지
➕해제한 메모리 다시 해제 방지
➖GC 작업은 순수 오버헤드
➖개발자는 언제 GC가 메모리를 해제하는지 모름
실시간성이 강조되는 프로그램은 GC 메모리관리를 권장하지 않음

GC 알고리즘

1. Reference Counting
힙 영역에 선언된 객체들이 각각 레퍼런스 카운트 라는 별도 숫자를 가지고 있음
레퍼런스 카운트가 0이 되면 GC 대상
➖순환 참조 문제: 서로 참조하는 객체들은 적용이 어려워 메모리 누수 발생

2. Mark and Sweep
루트에서 해당 객체에 접근 불가능할때 삭제
➖의도적으로 GC 실행시켜야
➖어플리케이션과 GC 실행 병행

JVM의 GC

객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다
객체의 생존기간에 따라 Heap영역을 Young, Old 영역으로 나뉨

Young Generation

  • 새롭게 생성된 객체가 할당되는 영역
  • 대부분 객체가 금방 Unreachable 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라짐
  • Minor GC: Young 영역에 대한 GC
    1. Eden 영역이 꽉 차면 Minor GC 발생
    2. Eden 영역에 살아남은 객체는 Survivor 영역으로 이동
    3. Survivor 영역이 모두 차면 다른 Survivor 영역으로 이동
    4. 계속하여 살아남은 객체는 Old 영역으로 Promotion

Old Generation

  • Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생
  • Major GC: Old 영역에 대한 GC
    - 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생

GC 동작방식

1. Stop the world

  • 가비지 컬렉션을 실행하기 위해 가상머신이 애플리케이션의 실행을 멈춤
  • GC 쓰레드를 제외한 모든 쓰레드 작업이 중단, GC가 완료되면 작업 재개
  • Stop the world 방식 속도 개선 튜닝 가능

2. Mark and sweep

  • 모든 작업을 중단시켰을때 스택의 모든 변수 또는 Reachable 객체를 스캔하여 어떤 객체를 참고하고 있는지 탐색
  • Mark: 사용되는 메모리를 식별
  • Sweep: Mark 되지 않은 객체를 메모리에서 제거
profile
안녕하세요

0개의 댓글