JAVA (22) - 가비지 컬렉션
1. 개요
자바(Java)는 C나 C++과 달리 개발자가 직접 메모리를 할당하고 해제하지 않는다. JVM(Java Virtual Machine)의 가비지 컬렉터(Garbage Collector)가 더 이상 사용되지 않는 메모리를 알아서 정리해 주기 때문이다. 메모리 관리를 자동화함으로써 개발자는 비즈니스 로직 구현에 집중할 수 있지만, 성능 최적화와 메모리 누수 방지를 위해서는 가비지 컬렉션(GC)의 동작 방식과 원리를 정확히 이해해야 한다.
2. 가비지 컬렉션(GC)의 기본 개념
가비지 컬렉션은 JVM의 Heap 영역에서 도달 불가능한(Unreachable) 객체를 찾아 메모리에서 해제하는 과정이다.
- Reachable: 객체가 참조되고 있어 유효한 상태를 의미한다.
- Unreachable: 어떤 변수나 객체도 해당 객체를 참조하고 있지 않아 메모리에서 제거 대상이 된 상태를 의미한다.
GC는 이러한 Unreachable 객체를 주기적으로 탐지하여 회수함으로써 OutOfMemoryError를 예방한다.
3. Stop-the-World와 Mark and Sweep
GC가 실행되는 주요 알고리즘 및 메커니즘은 크게 두 가지 개념으로 설명된다.
- Stop-the-World (STW)
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 중단하는 현상이다.
- STW가 발생하면 GC를 실행하는 스레드를 제외한 모든 스레드의 작업이 멈춘다. GC 튜닝은 주로 이 STW 시간을 최소화하는 것을 목표로 한다.
- Mark and Sweep (and Compact)
- Mark: 메모리에서 사용 중인 객체(Reachable)를 식별하는 단계다.
- Sweep: Mark 되지 않은 식별 불가능한 객체들을 메모리에서 제거하는 단계다.
- Compact: (선택적) 메모리 파편화를 방지하기 위해 남아있는 객체들을 한곳으로 모아 정돈하는 단계다.
4. JVM Heap 메모리의 세대별 구조
JVM은 객체의 생존 기간에 따라 Heap 영역을 구분하는 약한 세대 가설(Weak Generational Hypothesis)을 바탕으로 설계되었다.
- Young 영역 (Young Generation)
- 새롭게 생성된 객체 대부분이 위치하는 공간이다.
- 생존 주기가 짧은 객체가 많아 여기서 발생하는 GC를 Minor GC라고 부른다.
Eden, Survivor 0, Survivor 1 영역으로 세분화된다.
- Old 영역 (Old Generation)
- Young 영역에서 끝까지 살아남은 객체가 임계값(Age)을 넘어 이동(Promotion)하여 저장되는 공간이다.
- 덩치가 크고 오래 살아남는 객체가 모이며, 여기서 발생하는 GC를 Major GC (또는 Full GC)라고 부른다.
5. 대표적인 GC 알고리즘 종류
자바의 발전과 함께 GC 알고리즘도 성능 및 STW 시간 단축을 위해 계속 발전해 왔다.
- Serial GC: 단일 스레드로 동작하는 간단한 GC로, 소규모 메모리와 CPU 코어가 적은 환경에 적합하다.
- Parallel GC: Young 영역의 Minor GC를 다중 스레드로 처리하여 속도를 향상시킨 방식이다. (Java 8 기본)
- CMS GC: STW 시간을 최소화하기 위해 애플리케이션 스레드와 GC 스레드가 동시에 실행되도록 설계된 방식이다. (현재는 Deprecated)
- G1 GC (Garbage First GC): Heap을 바둑판 형태의 Region으로 나누어 가비지가 많은 영역을 우선적으로 정리한다. (Java 9 이상 기본)
- ZGC / Shenandoah GC: 대용량 메모리에서도 millisecond 단위의 매우 짧은 STW 시간을 보장하기 위해 도입된 고성능 GC이다.
6. 정리
자바의 가비지 컬렉션은 메모리 관리를 자동화하여 안정적인 개발 환경을 제공하는 핵심 메커니즘이다. Mark and Sweep 단계를 통해 도달 불가능한 객체를 정리하며, Heap 영역을 Young과 Old 세대로 나누어 효율성을 극대화한다. 서비스의 규모와 처리 특성에 맞는 적절한 GC 알고리즘을 선택하고 튜닝하면 Stop-the-World 시간을 단축하여 애플리케이션 성능을 크게 향상시킬 수 있다.