[Java] 가비지 컬렉터 (Garbage Collector, GC)

thezz9·2025년 3월 30일

개요

가비지 컬렉터는 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 힙(heap) 메모리에서 더 이상 참조되지 않는 객체가 차지하는 메모리를 자동으로 수집하고 해제하는 방식으로 메모리 관리를 수행하는 기능이다.

자바 버전마다 사용되는 GC 방식이 다르며, 시간이 지남에 따라 GC의 성능과 효율성이 향상되었다. 각 GC의 특징과 장단점을 정리해보려고 한다.


1. Serial GC (단일 스레드 방식)

  • JDK 버전: JDK 1.3

  • 동작 방식:

    • Serial GC는 단일 스레드로 동작하여, 애플리케이션에서 모든 GC 작업을 순차적으로 처리한다.
    • 가비지 컬렉션이 진행될 때 애플리케이션 스레드를 모두 멈추는 Stop-the-world(STW) 방식을 사용한다.
    • 전체 힙을 단일 스레드로 순차적으로 스캔하고, 더 이상 사용되지 않는 객체를 제거한다.
  • 장점:

    • 구현이 간단하고, 소형 시스템이나 메모리가 작은 환경에서 효과적이다.
    • 단일 스레드로 동작하기 때문에 멀티스레드 환경에서의 경쟁 상태를 고려할 필요가 없다.
  • 단점:

    • Stop-the-world 방식으로 애플리케이션이 멈추기 때문에 대규모 시스템에서 성능 문제가 발생할 수 있다.
    • 멀티코어 환경에서 비효율적이며, 멀티스레드 기반으로 최적화된 시스템에서는 성능이 떨어질 수 있다.

2. Parallel GC (병렬 방식)

  • JDK 버전: JDK 1.4

  • 동작 방식:

    • Parallel GC는 여러 개의 GC 스레드를 사용하여 가비지 컬렉션을 병렬 처리한다.
    • 힙을 Young GenerationOld Generation으로 나누어 각각 독립적으로 처리한다.
    • Stop-the-world 방식이지만, 여러 스레드가 병렬로 처리하여 시간을 단축시킨다.
  • 장점:

    • 멀티코어 시스템에서 성능이 크게 향상된다.
    • 대규모 시스템에서 많은 객체를 처리할 때 효율적이다.
  • 단점:

    • 여전히 Stop-the-world가 발생하여, 긴 GC 시간이 발생할 수 있다.
    • 응답 시간이 중요한 시스템에서는 부적합할 수 있다.

3. CMS (Concurrent Mark-Sweep) GC

  • JDK 버전: JDK 1.5

  • 동작 방식:

    • CMS GC는 병렬동시 방식으로 가비지 컬렉션을 수행한다.
    • Initial Mark 단계에서 잠깐 애플리케이션을 멈추고, 그 이후는 대부분의 작업을 애플리케이션과 동시에 수행한다.
    • MarkSweep 단계는 애플리케이션 스레드와 동시에 작업을 진행하며, 최종적으로 메모리를 청소한다.
  • 장점:

    • STW 시간을 최소화할 수 있어, 응답 속도가 중요한 시스템에 적합하다.
    • 웹 서버데이터베이스 서버처럼 빠른 응답 시간을 요구하는 애플리케이션에 효과적이다.
  • 단점:

    • 메모리 단편화 문제가 발생할 수 있다.
    • CPU 자원을 많이 소모하므로, 자원 관리에 유의해야 한다.
    • 최신 버전에서는 Garbage First(G1)로 대체되는 경향이 있다.

4. G1 (Garbage First) GC

  • JDK 버전: JDK 7 (JDK 9부터 기본)

  • 동작 방식:

    • G1 GC는 힙 메모리를 여러 개의 Region으로 나누고, 각 Region의 우선순위에 따라 가비지 컬렉션을 수행한다.
    • Young GenerationOld Generation을 통합적으로 관리하며, 우선순위가 높은 영역부터 GC를 수행한다.
    • G1은 STW 시간을 예측 가능하게 조절할 수 있도록 설계되었다.
  • 장점:

    • GC의 성능을 예측 가능하게 관리할 수 있다.
    • 대규모 애플리케이션에서 메모리 단편화 문제를 개선할 수 있다.
    • GC 시간의 최대 제한을 설정하여 일정한 성능을 보장한다.
  • 단점:

    • G1은 CMS보다 CPU 사용량이 많고, 소형 힙에서는 성능 향상이 적을 수 있다.
    • 초기화가 느리고, 설정이 복잡할 수 있다.

5. ZGC (Z Garbage Collector)

  • JDK 버전: JDK 11

  • 동작 방식:

    • ZGC는 STW 시간을 10ms 이하로 유지하는 것을 목표로 설계되었다.
    • 배경에서 대부분의 작업을 수행하며, 메모리 회수 과정에서 애플리케이션 스레드를 최소화한다.
    • ZGC는 힙 크기가 8MB~16TB까지 확장 가능한 대규모 시스템에서 잘 동작한다.
  • 장점:

    • 실시간 시스템에서 중요한 저지연 처리가 가능하다.
    • 대용량 힙에서 효율적으로 동작하며, 응답 시간이 매우 짧다.
    • Stop-the-world 시간이 10ms 이하로 매우 짧아 시스템 성능에 미치는 영향이 적다.
  • 단점:

    • CPU 사용량이 상대적으로 많다.
    • Windows 지원이 JDK 15부터 가능해지며, 초기 버전에서는 지원이 부족하다.

6. Shenandoah GC

  • JDK 버전: JDK 12

  • 동작 방식:

    • Shenandoah는 STW 시간을 1~10ms로 최소화하는 것을 목표로 설계되었다.
    • 배경에서 대부분의 가비지 컬렉션을 수행하며, 애플리케이션의 멈춤 시간은 거의 없다.
    • 병렬로 메모리를 회수하며, 대규모 시스템에서 잘 동작한다.
  • 장점:

    • 실시간에 가까운 성능을 제공하며, STW 시간이 짧다.
    • 멀티코어 환경에서 효율적이고 대규모 힙을 처리하는 데 유리하다.
  • 단점:

    • CPU 사용량이 높을 수 있으며, 메모리 공간을 충분히 확보해야 한다.
    • 메모리 관리가 복잡할 수 있어 작은 힙에서 성능이 크게 개선되지 않을 수 있다.

7. Generational ZGC (JDK 21)

  • JDK 버전: JDK 21

  • 동작 방식:

    • 기존 ZGC를 개선하여 Young Generation과 Old Generation을 구분하여 처리한다.
    • G1의 장점을 그대로 가져가면서, ZGC의 저지연 성능을 더욱 개선한다.
  • 장점:

    • STW 시간을 더 줄일 수 있어 대규모 실시간 시스템에서 매우 유용하다.
    • 기존 ZGC보다 성능 향상을 제공한다.
  • 단점:

    • 최신 기술로 실사용 사례가 적다.
    • 구성 및 설정이 복잡할 수 있다.

GC 종류 비교

GC 종류출시 연도STW 시간멀티코어 지원특징
Serial GCJDK 1.3단일 스레드, 소형 시스템 적합
Parallel GCJDK 1.4중간멀티코어, 높은 처리량
CMS GCJDK 1.5짧음STW 최소화, 메모리 단편화 문제
G1 GCJDK 7 (JDK 9 기본)예측 가능Region 기반, 단편화 해결
ZGCJDK 1110ms 이하초저지연, 대용량 메모리
ShenandoahJDK 121~10msSTW 최소화, 높은 CPU 사용량
Gen ZGCJDK 21매우 짧음ZGC 최적화 버전

결론

다음은 실무에서 채택한 JDK 버전별 사용 비율과 미사용 비율을 나타낸 표다.

JDK 버전사용 비율 (%)미사용 비율 (%)
Java 842.9 %57.1 %
Java 1128.6 %71.4 %
Java 1735.7 %64.3 %
Java 2135.7 %64.3 %
Java 240.0 %100.0 %

결론적으로, 실무에서는 JDK 7 미만을 쓰는 경우가 많지 않고, 대부분 JDK 8 이상 버전이 사용된다. 이에 따라 CMS GC는 점차 사용되지 않고, G1 GC, ZGC, Shenandoah GC가 주요 선택지가 된다. 특히, 응답 시간이 중요한 웹 애플리케이션에서는 G1 GC를 선택하는 경우가 많고, 대규모 실시간 시스템에서는 ZGC나 Shenandoah GC가 많이 사용된다고 한다.

최신 JDK에서는 JVM 옵션을 통해 GC를 설정하거나 변경할 수 있어, 각 GC 방식의 특성을 잘 이해하고 애플리케이션의 규모, 성능 요구 사항, 메모리 사용 패턴에 맞춰 적절한 GC를 선택하고 활용하는 것이 중요한 성능 최적화 전략이 된다고 볼 수 있겠다.

profile
개발 취준생

0개의 댓글