엔지니어 블로그
[JVM] GC란? 본문
1. GC(가비지 컬렉션)란?
GC란 힙(Heap) 메모리에 동적으로 할당된 객체 중 사용되지 않는 객체를 자동으로 식별하고 제거하는 프로세스를 의미합니다. GC 덕분에 개발자는 메모리 누수와 같은 메모리 관리 문제에 신경 쓰지 않고 프로그래밍에 집중할 수 있게 되었습니다.
그러나 GC는 다음과 같은 단점도 존재합니다.
- 객체의 메모리가 정확히 언제 해제되는지 알 수 없어, 개발자가 메모리 관리를 직접 제어하기 어렵습니다.
- GC가 실행되는 동안 모든 애플리케이션의 동작이 일시적으로 중단되는 Stop-The-World(STW) 현상이 발생하여 오버헤드가 생길 수 있습니다.
2. GC 대상은 어떻게 식별할까?
GC는 객체의 도달성(Reachability) 개념을 이용해 제거 대상을 식별합니다.
객체에 유효한 참조(reference)가 존재하면 Reachable(도달 가능), 참조가 하나도 없으면 Unreachable(도달 불가능) 상태가 됩니다. GC는 GC Root(스레드의 로컬 변수, static 변수 등 항상 접근 가능한 객체)로부터 객체의 참조 관계를 따라가면서 객체가 Reachable인지 판별합니다.
예를 들어, 다음과 같은 참조 관계가 있다고 해봅시다.
GC Root → A → B → C
이 경우 A, B, C 객체는 Reachable 상태입니다. 반면 GC Root에서 한 번도 연결되지 않은 객체는 Unreachable로 간주하여 GC 대상이 됩니다.
3. GC의 객체 제거 방식: Mark & Sweep
GC의 대표적인 제거 방식은 다음과 같습니다.
- Mark 단계: GC Root로부터 참조 가능한 객체(Reachable)를 표시(mark)합니다.
- Sweep 단계: Mark되지 않은 객체들(Unreachable)을 메모리에서 제거(sweep)합니다.
- Compact 단계: Sweep 단계 후 흩어져 있는 객체를 Heap 영역의 앞쪽으로 이동하여 메모리의 빈 공간을 최소화합니다.
4. Heap 영역 구성
Java의 Heap 메모리는 두 가지 가설을 전제로 설계되었습니다.
- 대부분의 객체는 생성된 후 빠르게 Unreachable 상태가 된다.
- 오래된 객체가 새로운 객체를 참조하는 경우는 드물다.
이러한 특성을 기반으로 Heap은 Young 영역과 Old 영역으로 나누어 구성됩니다.
4-1. Young 영역
- 새롭게 생성된 객체들이 모이는 영역입니다.
- 대부분의 객체는 Young 영역에서 생겼다가 곧 제거됩니다.
- Young 영역에서 수행되는 GC를 Minor GC라고 합니다.
- Young 영역은 Eden, Survivor0, Survivor1로 구성됩니다.
- 새로 생성된 객체는 Eden 영역에 할당됩니다.
- Minor GC 수행 후 살아남은 객체는 Survivor 영역으로 이동합니다.
- Survivor0과 Survivor1 중 하나는 항상 비어 있어야 합니다.
4-2. Old 영역
- Young 영역에서 오랜 기간 Reachable 상태를 유지한 객체가 모입니다.
- Young 영역보다 더 크게 할당되며, GC 수행 시간도 더 오래 걸립니다.
- Old 영역에서 수행되는 GC를 Full GC(Major GC)라고 합니다.
5. Minor GC 프로세스
Eden 영역이 객체로 가득 차면 Minor GC가 수행됩니다. 이때 살아남은 객체는 빈 Survivor 영역으로 이동되며, 객체는 매번 GC를 통과할 때마다 나이를 뜻하는 Age 값이 증가합니다. 이 과정이 반복되어 객체의 Age 값이 특정 임계치에 도달하면, 해당 객체는 Old 영역으로 이동합니다. 이 과정을 Promotion이라고 합니다.
6. Full GC 프로세스
Old 영역이 가득 차면 Full GC가 수행됩니다. Old 영역은 Young 영역보다 메모리가 크기 때문에, GC 수행 시간이 더 길어지고 STW가 발생할 가능성이 높습니다. Minor GC가 약 0.5~1초 걸린다면, Full GC는 보통 이보다 10배 이상 긴 시간이 걸릴 수 있습니다.
'글공부' 카테고리의 다른 글
[OS] 멀티 스레딩 환경의 동기화 (1) | 2025.04.01 |
---|---|
[컴퓨터 밑바닥의 비밀] 운영체제,프로세스,스레드의 근본 이해하기 - 1 (0) | 2025.03.11 |
[컴퓨터 밑바닥의 비밀] 컴파일러 (0) | 2025.03.07 |
[컴퓨터 밑바닥의 비밀] 프로그래밍 언어와 컴파일러,인터프리터 언어의 발생 (0) | 2025.03.06 |
[컴퓨터구조] 컴퓨터 구조의 큰 그림 (0) | 2023.12.06 |