가비지 컬렉션(Garbage Collection)이란?
가비지 컬렉션, 줄여서 GC란 메모리 내에서 더 이상 참조되지 않는 객체를 찾아 제거하는 메모리 관리 기법이다.
C나 C++은 free(), delete, delete[]로 동적으로 할당한 메모리를 해제할 수 있다.
하지만 Java, JavaScript 등은 이러한 메소드가 따로 존재하지 않는다!
즉, 함수 호출을 따로 하지 않아도 Java의 JVM / JavaScript의 V8 내의 가비지 컬렉터가 자동으로 메모리를 회수한다.
가비지 컬렉션의 동작 과정
그렇다면 메모리 내에서 존재하는 객체들 중 더 이상 참조되지 않는 객체를 찾아 제거한다고 했는데,
그 객체는 어디 있고 어떻게 제거될까?

해답은 바로 프로세스의 Heap 영역이다!
Heap은 동적으로 메모리를 할당받는 공간이다. 이 영역은 다시 Young / Old 영역으로 나뉘어진다.
Young 영역
- 새롭게 생성된 객체가 할당되는 영역
- 전체 Heap 영역 중 대략 30%를 차지한다.
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Young 영역에 대한 가비지 컬렉션을 Minor GC라고 한다.
Old 영역
- Young 영역에서 Reachable 상태를 유지하며 오랫동안 살아남은 객체가 복사되는 영역
- 전체 Heap 영역 중 대략 70%를 차지한다.
- Old 영역에 대한 가비지 컬렉션을 Major GC라고 한다.

📍 Minor GC
Young 영역에서는 다시 하나의 Eden과 두 개의 Survivor 영역으로 구분된다.
Eden은 객체가 처음 생성되는 공간이며, Eden 공간이 꽉 차게 되면 "Minor GC"가 발생한다.
1. Eden에서 더 이상 사용되지 않는 객체는 제거되고, 계속 사용되는 객체는 Survivor 1 영역으로 이동한다.
2. 또 다시 Eden 영역이 가득 차면, Eden 영역과 Survivor 1 영역에서 다시 사용하는 객체만 모두 Survivor 2로 이동한다.
3. 1과 2를 반복한다.
(※ 두 Survivor 영역 중 한 영역만 사용되어야 하며, 1과 2는 번갈아가며 사용된다.)
📍 Major GC
Young 영역에서 오래 살아남은 객체는 Old 영역으로 옮겨진다.
Old 영역이 꽉 차게 되면 "Major GC"가 발생한다.
하지만 Old 영역은 Young 영역에 비해 크기 때문에 상대적으로 가비지 컬렉션이 적게 발생한다.
가비지 컬렉션(Garbage Collection) 알고리즘
가비지 컬렉션이 수행되는 동안 메모리의 일관성을 유지하려면,
GC를 실행하는 스레드를 제외한 모든 애플리케이션 스레드는 GC 과정이 완료될 때까지 정지되어야 한다.
이때 JVM이 애플리케이션의 실행을 멈추는 현상을 Stop-The-World라 한다.
가비지 컬렉션 알고리즘은 Stop-The-World로 인한 지연 시간을 최소화하기 위해 설계되었으며, 알고리즘의 종류는 다음과 같다.
- Mark-Sweep: 살아 있는 객체를 표시(mark)하고, 제거된 객체는 정리(sweep)하는 방식
- Mark-Compact: Mark-Sweep의 단점인 메모리 단편화를 방지하기위해 살아 있는 객체들을 한쪽으로 재배치(compact)하는 방식
- Generational GC: Heap을 Young과 Old 영역으로 나눠, 짧은 주기로 Minor GC를 수행하는 방식
(※ 위 가비지 컬렉션의 동작 과정과 동일하다. 보편적으로 쓰이는 알고리즘이기 때문!) - Concurrent GC: Stop-The-World 현상을 최소화하기 위해 GC 스레드와 애플리케이션 스레드가 동시에 실행되는 방식
- Concurrent Mark-Sweep GC: Mark-Sweep 기반이지만 대부분의 작업을 애플리케이션과 동시에 수행하는 방식
:)
출처
https://mangkyu.tistory.com/118
https://medium.com/@delivalue100/gc-garbage-collection-8f342f046ce6
'Computer Science > 운영체제' 카테고리의 다른 글
| [OS] 메모리 관리- 페이징(Paging)과 세그먼테이션(Segmentation) (2) | 2025.08.21 |
|---|---|
| [OS] 시스템 콜(System Call) (3) | 2025.08.14 |
| [OS] 프로세스 동기화(Process Synchronization) (5) | 2025.08.03 |
| [OS] IPC(Inter-Process Communication) (4) | 2025.07.31 |
| [OS] 프로세스(Process) vs 스레드(Thread) (0) | 2025.06.19 |