Serial GC(직렬)
- JDK에 도입된 최초의 가비지 컬렉터이며, 단일 스레드로 동작하는 가장 단순한 형태
- 작은 힙 메모리와 단일 CPU환경에 적합하며 Stop-The-World시간이 가장 길게 발생
Parallel GC(병렬)
- Java 5 ~ 8까지 Default가비지 컬렉터로 사용되었으며, Serial GC와 달리 Young 영역의 GC를 멀티 스레드로 수행한다.
- 높음 처리량에 초점을 두기 때문에 Throughtput(처리량) GC라고도 불린다.
Parallel Old GC
- Parallel GC의 향상된 버전으로 Old영역에서도 멀티스레드를 활용하여 GC를 수행한다
CMS(Concurrent Mark-Sweep) GC
- Java 5 ~ 8까지 사용된 가비지 컬렉터로 애플리케이션 스레드와 병렬로 실행되어 Stop-The-World 시간을 최소화하도록 설계됨
- 메모리와 CPU사용량이 많고, 메모리 압축을 수행하지 않아 메모리 단편화 문제가 있다.
- Java 9부터 deprecated되고, Java 14에서 완전히 제거되었다.
G1(Garbage Firsr) GC
- Java9부터 default 가비지 컬렉터이며, 기존의 GC방식과 달리 힙을 여러 개의 region으로 나누어 논리적으로 Young, Old 영역을 구분
- 처리량과 Stop-The-World시간 사이의 균형을 유지하며 32GB보다 작은 힙 메모리를 사용할 때 가장 효과적
- GC대상이 많은 region을 먼저 회수하기 때문에 gerbage first라는 이름이 붙었다.
- 핵심 : 바둑판 모양의 Region 개념을 도입하여 전체 청소는 힘드니까, 쓰레기가 제일 많이 쌓인(Garbage First) 칸부터 우선적으로 치우자는 전략
ZGC
- Java11부터 도입된 가비지 컬렉터로, 10ms 이하의 Stop-The-World시간과 대용량 힙을 처리할 수 있도록 설계
- Colored Pointers라는 기술을 써서 객체 주소에 마킹을 직접 함. 덕분에 STW 시간이 매우 짧음.
Shenandoah GC
- Red Hat에서 개발한 가비지 컬렉터로, Java12부터 도입
- G1 GC와 마찬가지로 힙을 여러 개의 region으로 나누어 처리하며, ZGC처럼 저지연 Stop-The-World와 대용량 힙 처리를 목표로 한다.
✨Java의 메모리 영역 (Heap)
GC를 이해하려면 쓰레기가 쌓이는 장소인 Heap 구조를 알아야 합니다. 자바는 객체의 수명에 따라 영역을 나눕니다.
| 영역 | 특징 | 발생하는 GC |
| Young Generation | 새롭게 생성된 객체들이 위치함. 대부분 금방 쓰레기가 됨. | Minor GC (빠름) |
| Old Generation | Young 영역에서 살아남은 '장수' 객체들이 이동함. | Major / Full GC (느림) |
✨가비지 컬렉션의 공통 동작 원리 (Mark-and-Sweep)
대부분의 GC는 기본적으로 2단계(또는 3단계) 거쳐 동작합니다.
- Mark (마킹): 메모리에서 사용 중인 객체와 사용하지 않는 객체를 식별합니다. (살아있는 객체에 표시)
- Sweep (쓸기): 마킹되지 않은(사용되지 않는) 객체들을 메모리에서 해제합니다.
- Compact (압축): (선택 사항) 여기저기 흩어진 객체들을 한곳으로 모아 메모리 단편화를 제거합니다.
✨GC 선택 기준
| 구분 | 주요 특징 | 추천 환경 |
| Parallel GC | 높은 처리량, STW 감수 | 데이터 분석, 배치 작업 |
| G1 GC | 균형 잡힌 성능, 현대 표준 | 대부분의 일반 서버 (API 서버 등) |
| ZGC | 극도의 저지연 (STW 최소화) | 대용량 메모리 사용, 실시간 응답이 중요한 서비스 |
'cs(with 매일메일)' 카테고리의 다른 글
| [260216월] 열 기반 DB와 행 기반 DB의 차이점은 무엇인가요? (0) | 2026.02.19 |
|---|---|
| [260213금] 페이지 교체 알고리즘에 대해서 설명해 주세요. (0) | 2026.02.19 |
| [260211수] PRG 패턴에 대해서 설명해 주세요. (0) | 2026.02.19 |
| [260210화] 멀티 쓰레딩에 대해서 설명해 주세요. (0) | 2026.02.10 |
| [260209월] RDB에서 페이징 쿼리의 필요성을 설명해 주세요. (0) | 2026.02.09 |