자바 가비지 컬렉션(Garbage Collection, GC)은 자바 가상 머신(JVM)이 더 이상 사용되지 않는 객체들을 자동으로 메모리에서 해제하는 메커니즘입니다. 이를 통해 개발자는 메모리 관리를 직접 할 필요 없이 메모리 누수(memory leak)를 방지할 수 있습니다. 자바의 가비지 컬렉션은 주로 다음과 같은 방식으로 동작합니다.
가비지 컬렉션의 주요 개념
힙 메모리:
자바 프로그램이 실행될 때 모든 객체는 힙(heap) 메모리에 할당됩니다. 힙 메모리는 Young Generation과 Old Generation으로 나누어집니다.
Young Generation:
Eden Space: 새로 생성된 객체들이 처음 할당되는 영역입니다.
Survivor Spaces (S0, S1): Eden 영역에서 살아남은 객체들이 이동하는 영역입니다. 두 개의 Survivor 영역이 번갈아 사용됩니다.
Old Generation:
Young Generation에서 살아남은 객체들이 결국 이동하게 되는 영역입니다. 객체의 수명이 길수록 Old Generation에 위치하게 됩니다.
가비지 컬렉션 알고리즘
Mark-and-Sweep:
Mark 단계: 모든 객체 그래프를 탐색하여 도달 가능한 객체에 마킹합니다.
Sweep 단계: 마킹되지 않은 객체들을 메모리에서 해제합니다.
Mark-and-Compact:
Mark 단계: Mark-and-Sweep과 동일하게 도달 가능한 객체에 마킹합니다.
Compact 단계: 마킹된 객체들을 한쪽으로 이동시켜 메모리의 단편화를 방지합니다.
Copying:
Young Generation에서 주로 사용되는 알고리즘입니다. Eden과 Survivor 영역을 사용하여, Eden에서 살아남은 객체를 Survivor 영역으로 복사합니다.
가비지 컬렉션 종류
Serial GC:
단일 스레드를 사용하여 가비지 컬렉션을 수행합니다. 작은 애플리케이션에 적합합니다.
옵션: -XX:+UseSerialGC
Parallel GC:
여러 스레드를 사용하여 가비지 컬렉션을 수행합니다. 멀티코어 시스템에서 효율적입니다.
옵션: -XX:+UseParallelGC
CMS (Concurrent Mark-Sweep) GC:
Old Generation에서 병렬로 가비지 컬렉션을 수행합니다. 응답 시간이 중요한 애플리케이션에 적합합니다.
옵션: -XX:+UseConcMarkSweepGC
G1 (Garbage-First) GC:
힙을 여러 영역으로 나누어 병렬로 가비지 컬렉션을 수행합니다. 대규모 힙을 사용하는 애플리케이션에 적합합니다.
옵션: -XX:+UseG1GC
ZGC (Z Garbage Collector):
매우 짧은 GC 일시 중지를 목표로 설계되었습니다. 대규모 메모리를 효율적으로 관리합니다.
옵션: -XX:+UseZGC
가비지 컬렉션 튜닝
가비지 컬렉션의 성능을 최적화하기 위해 JVM 옵션을 조정할 수 있습니다. 주요 튜닝 포인트는 다음과 같습니다.
힙 크기 조정:
-Xms 및 -Xmx 옵션을 사용하여 힙 메모리의 초기 크기와 최대 크기를 설정합니다.
GC 로그 활성화:
-Xlog:gc* 옵션을 사용하여 가비지 컬렉션 로그를 활성화하여 GC 동작을 분석할 수 있습니다.
GC 정책 선택:
애플리케이션의 특성에 맞는 GC 정책을 선택합니다. 예를 들어, 응답 시간이 중요한 경우 CMS 또는 G1 GC를 선택할 수 있습니다.
결론
자바의 가비지 컬렉션은 메모리 관리를 자동화하여 개발자가 메모리 해제를 신경 쓰지 않도록 도와줍니다. 다양한 GC 알고리즘과 정책을 통해 다양한 애플리케이션 요구사항에 맞게 튜닝할 수 있습니다. 효과적인 GC 튜닝을 위해서는 애플리케이션의 메모리 사용 패턴을 이해하고, 적절한 JVM 옵션을 선택하는 것이 중요합니다.