가비지 컬렉터는 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 힙(heap) 메모리에서 더 이상 참조되지 않는 객체가 차지하는 메모리를 자동으로 수집하고 해제하는 방식으로 메모리 관리를 수행하는 기능이다.
자바 버전마다 사용되는 GC 방식이 다르며, 시간이 지남에 따라 GC의 성능과 효율성이 향상되었다. 각 GC의 특징과 장단점을 정리해보려고 한다.
JDK 버전: JDK 1.3
동작 방식:
Stop-the-world(STW) 방식을 사용한다.장점:
단점:
Stop-the-world 방식으로 애플리케이션이 멈추기 때문에 대규모 시스템에서 성능 문제가 발생할 수 있다.JDK 버전: JDK 1.4
동작 방식:
Stop-the-world 방식이지만, 여러 스레드가 병렬로 처리하여 시간을 단축시킨다.장점:
단점:
Stop-the-world가 발생하여, 긴 GC 시간이 발생할 수 있다.JDK 버전: JDK 1.5
동작 방식:
Mark와 Sweep 단계는 애플리케이션 스레드와 동시에 작업을 진행하며, 최종적으로 메모리를 청소한다.장점:
단점:
JDK 버전: JDK 7 (JDK 9부터 기본)
동작 방식:
장점:
단점:
JDK 버전: JDK 11
동작 방식:
장점:
Stop-the-world 시간이 10ms 이하로 매우 짧아 시스템 성능에 미치는 영향이 적다.단점:
JDK 버전: JDK 12
동작 방식:
장점:
단점:
JDK 버전: JDK 21
동작 방식:
장점:
단점:
| GC 종류 | 출시 연도 | STW 시간 | 멀티코어 지원 | 특징 |
|---|---|---|---|---|
| Serial GC | JDK 1.3 | 김 | ✗ | 단일 스레드, 소형 시스템 적합 |
| Parallel GC | JDK 1.4 | 중간 | ✔ | 멀티코어, 높은 처리량 |
| CMS GC | JDK 1.5 | 짧음 | ✔ | STW 최소화, 메모리 단편화 문제 |
| G1 GC | JDK 7 (JDK 9 기본) | 예측 가능 | ✔ | Region 기반, 단편화 해결 |
| ZGC | JDK 11 | 10ms 이하 | ✔ | 초저지연, 대용량 메모리 |
| Shenandoah | JDK 12 | 1~10ms | ✔ | STW 최소화, 높은 CPU 사용량 |
| Gen ZGC | JDK 21 | 매우 짧음 | ✔ | ZGC 최적화 버전 |
다음은 실무에서 채택한 JDK 버전별 사용 비율과 미사용 비율을 나타낸 표다.
| JDK 버전 | 사용 비율 (%) | 미사용 비율 (%) |
|---|---|---|
| Java 8 | 42.9 % | 57.1 % |
| Java 11 | 28.6 % | 71.4 % |
| Java 17 | 35.7 % | 64.3 % |
| Java 21 | 35.7 % | 64.3 % |
| Java 24 | 0.0 % | 100.0 % |
결론적으로, 실무에서는 JDK 7 미만을 쓰는 경우가 많지 않고, 대부분 JDK 8 이상 버전이 사용된다. 이에 따라 CMS GC는 점차 사용되지 않고, G1 GC, ZGC, Shenandoah GC가 주요 선택지가 된다. 특히, 응답 시간이 중요한 웹 애플리케이션에서는 G1 GC를 선택하는 경우가 많고, 대규모 실시간 시스템에서는 ZGC나 Shenandoah GC가 많이 사용된다고 한다.
최신 JDK에서는 JVM 옵션을 통해 GC를 설정하거나 변경할 수 있어, 각 GC 방식의 특성을 잘 이해하고 애플리케이션의 규모, 성능 요구 사항, 메모리 사용 패턴에 맞춰 적절한 GC를 선택하고 활용하는 것이 중요한 성능 최적화 전략이 된다고 볼 수 있겠다.