본문 바로가기
Language/Java

[JAVA] Garbage Collector(GC) 완벽 가이드 : Serial부터 ZGC까지 핵심 정리

by Papa Martino V 2026. 1. 22.
728x90

 

가비지 컬렉터(GC)
Garbage Collector (GC)

 

자바 개발자에게 메모리 관리의 자동화는 축복과도 같습니다. C나 C++처럼 직접 메모리를 해제할 필요 없이, JVM(Java Virtual Machine)의 가비지 컬렉터(Garbage Collector, GC)가 더 이상 사용되지 않는 객체를 식별하고 제거해 주기 때문입니다. 하지만 애플리케이션의 규모가 커지고 응답 속도가 중요해짐에 따라, 어떤 GC를 선택하느냐는 서비스의 품질을 결정짓는 핵심 요소가 되었습니다. 오늘날 사용되는 5가지 핵심 GC의 특성과 진화 과정을 깊이 있게 살펴보겠습니다.


1. 가비지 컬렉션의 핵심 메커니즘

가비지 컬렉터는 기본적으로 'Stop-the-world'라는 현상을 수반합니다. 이는 GC를 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 것을 의미합니다. GC 튜닝의 목표는 바로 이 정지 시간을 최소화하면서 메모리를 효율적으로 회수하는 것입니다.


2. 주요 가비지 컬렉터(GC) 종류 및 비교

자바의 역사와 함께 발전해 온 가비지 컬렉터들은 각기 다른 철학과 목적을 가지고 설계되었습니다.

종류 주요 특징 적합한 환경 방식
Serial GC 단일 스레드로 GC 수행 저사양 PC, 소규모 데이터 Mark-Sweep-Compact
Parallel GC GC 스레드 다중화 (Throughput 위주) 멀티 코어 서버, 처리량 중시 Parallel Copy/MS
CMS GC 정지 시간(Pause) 최소화 설계 응답 속도가 중요한 서비스 Concurrent Mark Sweep
G1 GC Region 개념 도입, 효율적 메모리 분할 대용량 힙(4GB+), 최신 표준 Incremental/Concurrent
ZGC 초저지연(10ms 미만) 목표 초대형 힙(TB급), 극도의 저지연 Colored Pointers / Load Barriers

3. 각 GC별 심층 분석

Serial GC (-XX:+UseSerialGC)

가장 오래된 방식으로, CPU 코어가 하나일 때 사용하기 위해 설계되었습니다. GC를 처리하는 스레드가 하나이므로 정지 시간이 매우 깁니다. 현대적인 서버 환경에서는 거의 사용되지 않지만, 자원이 극도로 제한된 임베디드 환경에서는 여전히 유효합니다.

Parallel GC (-XX:+UseParallelGC)

Java 8의 기본 GC입니다. Serial GC와 알고리즘은 유사하지만, GC를 처리하는 스레드를 여러 개 사용하여 처리 속도를 높였습니다. 메모리가 충분하고 CPU 성능이 좋을 때 '처리량(Throughput)' 측면에서 큰 이점을 가집니다.

CMS(Concurrent Mark Sweep) GC

애플리케이션 스레드와 GC 스레드가 동시에 실행되어 'Stop-the-world' 시간을 줄였습니다. 하지만 메모리 파편화(Fragmentation) 문제와 CPU 자원 소모가 크다는 단점이 있어, Java 9부터 Deprecated 되었고 최신 버전에서는 제거되었습니다.

G1(Garbage First) GC (-XX:+UseG1GC)

현재 Java 9 이상의 표준 GC입니다. 전체 힙을 바둑판 형태의 Region으로 나누어 관리합니다. 가비지가 많은 영역을 우선적으로 치우기 때문에 'Garbage First'라는 이름이 붙었습니다. 힙 크기가 커질수록 성능이 급격히 떨어지는 기존 GC의 단점을 혁신적으로 극복했습니다.

ZGC (-XX:+UseZGC)

Java 11에서 도입되어 Java 15에서 정식 채택된 차세대 GC입니다. 힙 크기에 상관없이 정지 시간을 10ms 미만으로 유지하는 것을 목표로 합니다. 'Colored Pointers'라는 기술을 사용하여 객체의 상태를 비트 단위로 관리하며, 대규모 트래픽을 처리하는 엔터프라이즈 환경에서 강력한 성능을 발휘합니다.


4. 실무 선택 가이드 (Sample Scenarios)

어떤 GC를 선택해야 할지 고민이라면 다음의 가이드를 참고하십시오.

  • 사례 1: 단순한 배치 작업이나 데이터 분석 프로그램 → Parallel GC (전체 처리량 극대화)
  • 사례 2: 일반적인 웹 API 서버 및 스프링 부트 애플리케이션 → G1 GC (안정성과 성능의 균형)
  • 사례 3: 금융권 시스템이나 실시간 게임 서버 → ZGC (지연 시간 극도로 억제)

5. 결론: 진화하는 메모리 관리

자바의 GC는 단순한 메모리 청소를 넘어, 하드웨어의 발전과 사용자 요구에 맞춰 끊임없이 진화해 왔습니다. Java 17 이상의 LTS 버전을 사용하고 있다면 기본값인 G1 GC로도 충분히 훌륭한 성능을 낼 수 있지만, 시스템의 특성에 맞춰 ZGC 등을 고려해 보는 안목이 전문 개발자의 역량일 것입니다.

 

내용 출처:

  • Oracle Java SE Documentation: HotSpot Virtual Machine Garbage Collection Tuning Guide
  • OpenJDK Wiki: ZGC Project Page
  • Baeldung: Understanding Java Garbage Collection
728x90