1022 단어
5 분
Garbage Collection

Garbage Collection 개념#

NOTE

**Garbage Collection(이하 GC)**란,

동적으로 할당한 메모리 중 더이상 필요없는 객체를 모아 제거하는 메모리 관리 기법

이때 동적으로 할당된 메모리는 Heap 영역에 할당되므로, GC는 Heap 영역을 직접적으로 관리한다 라고 이해하면 됨

  • C 언어의 경우 malloc() free() 등을 통해 직접 메모리 관리를 해야함
  • Java 개발자는 GC로 인해 메모리 관리에 신경쓰지 않고 개발에만 집중할 수 있음
  • Kotlin을 포함하여 Python, Go, Javascript 등 많은 언어에서도 GC가 내장되어 있음

Heap 영역#

  • GC의 성능 향상을 위해, Heap 영역은 Young Generation과 Old Generation으로 나눠짐

Young Generation : 최근에 생성된 객체가 할당되는 영역

  • Eden : new를 통해 새로 생성된 객체가 할당
  • S0, S1(Survivior0, 1) : GC가 실행된 이후에도 살아남은 객체가 할당되는 영역

Old Genaration : Young Generation의 객체가 특정 임계점에 도달하면 할당되는 영역

  • 임계점 지표로 사용되는 값으로 Age가 대표적이며, 이는 Survivor 영역에서 객체가 살아남은 횟수를 의미
  • 설정값에 따라 달라지나, 일반적으로 Young Generation의 공간보다 2-3배 큰 공간을 가짐
NOTE

왜 이런 구조가 GC 성능 향상에 도움이 될까?

  • 대부분의 객체는 금방 접근 불가능한 상태가 됨
  • 오래된 객체가 젊은 객체를 참조하는 경우는 드뭄

따라서, 크기가 작은 Young Generation을 대상으로 GC를 자주 수행하고, 크기가 큰 Old Generation을 대상으로는 GC를 비교적 적게 실행

Stop-The-World#

Stop-The-Word(이하 STW)란, GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상을 의미

즉, GC가 작동하는 동안 GC가 수행되는 스레드를 제외한 모든 스레드는 멈추게 됨

따라서 GC가 너무 자주 실행되면 프로그램의 성능 하락으로 이어지며, GC의 성능을 개선한다는 것은 곧 STW의 시간을 최소화하는 작업을 의미

Mark And Sweep#

Mark And Sweep이란, GC의 대상 객체를 식별하고 제거하는 과정을 의미

  • Mark : 사용되고 있는 객체(reachable)를 찾아내 마킹하는 단계
  • Sweep : 사용되지 않는 객체(unreachable)를 Heap에서 제거하는 단계
  • Compaction : Sweep 후에 분산된 객체를 압축하는 단계
NOTE

GC에 따라 수행하지 않는 경우도 있다.

Minor GC 과정#

Minor GC란, Young Generaion에서 발생하는 GC를 의미한다.

Old Generation에 비해 상대적으로 공간이 작아 GC 소요 시간 또한 적기 때문에 이러한 이름이 붙었다.

  1. 처음 생성된 객체는 Eden 영역에 할당
  2. Eden 영역이 가득 차면, Minor GC 실행
  3. Mark 동작을 통해 사용되는 객체를 탐색하고, Survivor 영역으로 이동
  4. Sweep 동작을 통해 Eden 영역의 사용되지 않는 객체 삭제
  5. 살아남은 객체의 age 값 증가
  6. 이후 Eden 영역이 가득 찰 때마다 Minor GC를 실행하고, 남은 Survivor 영역으로 이동
  • Young Generaion에서는 이러한 과정을 반복 살펴본 바와 같이, Eden 영역이 가득 찰 때마다 GC가 실행된다는 특징

Major GC 과정#

Major GC란, Old Generation에서 발생하는 GC를 의미

Young Generation의 객체가 특정 임계값에 도달하면 Old Generation으로 이동함. 이제 Major GC란?

  1. Young Generation의 객체가 특정 임계값(Age = 8)에 도달
  2. 임계값에 도달한 객체가 Old Generation으로 이동
  3. 위 과정이 반복되어 Old Generation 공간이 가득 차면, Major GC 실행

Old Genaration에서는 Young Generation과 같이 영역이 나뉘지 않으므로, 별도의 공간 이동없이 Mark And Sweep 과정을 통해 사용되지 않는 객체가 모두 삭제

Garbage Collection
https://devlog.jpstudy.org/posts/2025/cs/garbage_collection/
저자
SY
게시일
2025-06-01
라이선스
CC BY-NC-ND 4.0