Garbage Collection (GC)
가비지 컬렉션 (Garbage Collection)은 자바의 메모리 관리 방법 중 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스를 말한다.
C/C++ 언어에서는 이러한 가비지 컬렉션이 없어 개발자가 수동으로 메모리 할당과 해제를 일일이 해줘야한다. 반면, Java에서는 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 하고, 개발자 입장에서는 메모리 관리, 메모리 누구 문제에 대해서는 관리하지 않아도 된다.
장점
- 메모리 누수 방지 : 개발자가 메모리 해제에 대해 신경 쓰지 않아도 되므로, 메모리 누수와 같은 잠재적인 오류를 줄여준다.
- 생산성 향상 : 메모리 관리에 들어갈 개발 시간을 핵심 비즈니스 로직 개발에 집중할 수 있게 한다.
- 효율적인 메모리 사용 : JVM 프로세스가 한정된 메모리를 효율적으로 사용할 수 있도록 돕는다.
단점
자동으로 잘 처리해준다고 해도 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있다. -> 이를 `Stop-The-World (STW)`라 한다.
이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다. 예를 들면, 익스플로러는 이 가비지 컬렉션을 너무 자주 실행하여 성능 문제를 일으키는 것으로 악명이 높았다. 이런 특성에 따라 실시간 성이 매우 강조되는 프로그램일 경우 가비지 컬렉터(GC)에게 메모리를 맞기는 것은 맞지 않을 수 있다. 따라서 애플리케이션의 사용성을 유지하면서 효율적이게 GC를 실행하는 최적화 작업이 개발자의 숙제가 된다.
GC 최적화 작업 -> GC 튜닝이라고 한다.
가비지 컬렉션 대상
가비지 컬렉션은 어떤 Object를 Garbage로 판단해서 스스로 지우는 것일까 ? 가비지 컬렉션은 특정 객체가 Garbage인지 아닌지 판단하기 위해 도달성, 도달 능력(Reachability) 이라는 개념을 적용한다.
객체가 레퍼런스가 있다면 `Reachable`로 구분되고, 객체에 유효한 레퍼런스가 없다면 `Unreachable`로 구분해버리고 수거한다.
- Reachable : 객체가 참조되고 있는 상태
- Unreachable : 객체가 참조되고 있지 않은 상태 -> GC의 대상이 된다.
가비지 컬렉션 방식
GC가 Unreachable한 객체를 어떤 방식으로 청소하는가.
Mark and Sweep
가비지 컬렉션이 될 대상 객체를 식별(Mark)하고 제거(Sweep)하며 객체가 제거되어 파편화된 메모리 영역을 앞에서부터 채워나가는 작업을 수행한다.
- Mark 과정 : 먼저 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
- Sweep 과정 : 참조하고 있지 않은 객체 즉, Unreachable 객체들을 Heap에서 제거한다.
- Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다.
가비지 컬렉션 동작 과정
Heap 메모리 구조
JVM의 Heap 영역은 동적으로 레퍼런스 데이터가 저장되는 공간으로, 가비지 컬렉션에 대상이 되는 공간이다. Heap 영역은 처음 설계될 때 다음의 2가지 전제로 설계되었다.
1) 대부분의 객체는 금방 접근 불가능한 상태가 된다.
2) 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
즉, 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다는 것이다.
이러한 특성을 이용해 개발자들은 보다 효율적인 메모리 관리를 위해, 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누게 되었고, Young과 Old 총 2가지 영역으로 설계하였다.

1) Young 영역 (Young Generation)
새롭게 생성된 객체가 할당되는 영역으로 대부분의 객체가 금방 Unreachable 상태가 되기 때문에 많은 Young 영역에 생성되었다가 사라진다. Young 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다.
그리고 Young 영역을 3가지 영역으로 나눈다.
Eden
`new`를 통해 새로 생성된 객체가 위치한다. 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보낸다.
Survivor 0/Survivor 1
최소 1번의 GC 이상 살아남은 객체가 존재하는 영역으로 Survivor 영역에는 특별한 규칙이 있는데, Survivor 0 또는 Survivor 1 둘 중 하나에는 꼭 비어 있어야 하는 것이다.
2) Old 영역 (Old Generation)
Younng 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역으로 Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다. Old 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.
✅ Minor GC 과정

모든 객체는 처음에 Young Generation에 생성되게 된다. Young Generation의 공간은 Old Generation에 비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는 데 적은 시간이 걸린다. (작은 공간에서 데이터를 찾기 때문.) 이 때문에 Young Generation 영역에서 발생되는 GC를 Minor GC라고 불린다.
✅ Major GC 과정

Major GC는 Old 영역의 데이터가 가득 차면 GC를 실행하는 단순한 방식이다. Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하는 Major GC가 실행되게 된다. 하지만 Old Generation은 Young Generation에 비해 상대적으로 큰 공간을 가지고 있어, 이 공간에서 메모리 상의 객체 제거에 많은 시간이 걸리게 된다.
바로 여기서 앞서 말한 `Stop-The-World` 문제가 발생하게 된다. Major GC가 일어나면 Thread가 멈추고 `Mark and Sweep` 작업을 해야 해서 CPU에 부하를 주기 때문에 멈추거나 버벅이는 현상이 일어나기 때문이다.
이것이 자바 가비지 컬렉션 알고리즘을 발전 시키게 되었다.
참고
☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리
Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객
inpa.tistory.com
'Java' 카테고리의 다른 글
| [Java] 가비지 컬렉션 알고리즘 종류 (0) | 2025.12.16 |
|---|---|
| [Java] JVM(자바 가상 머신)에 대한 모든 것 (0) | 2025.11.10 |
| [Java] 자바 변수 4가지 정리 (전역, 지역, 정적, 멤버 변수) (0) | 2025.11.10 |
| [Java] 원시타입(Primitive Type)과 참조타입(Reference Type) (0) | 2025.10.14 |
| [Java] 스트림(Stream)에 대하여 (0) | 2025.10.14 |
