본문 바로가기

cs(with 매일메일)

[260212목] GC알고리즘은 어떤 것이 있나요?

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단계) 거쳐 동작합니다.

  1. Mark (마킹): 메모리에서 사용 중인 객체와 사용하지 않는 객체를 식별합니다. (살아있는 객체에 표시)
  2. Sweep (쓸기): 마킹되지 않은(사용되지 않는) 객체들을 메모리에서 해제합니다.
  3. Compact (압축): (선택 사항) 여기저기 흩어진 객체들을 한곳으로 모아 메모리 단편화를 제거합니다.

✨GC 선택 기준

구분 주요 특징 추천 환경
Parallel GC 높은 처리량, STW 감수 데이터 분석, 배치 작업
G1 GC 균형 잡힌 성능, 현대 표준 대부분의 일반 서버 (API 서버 등)
ZGC 극도의 저지연 (STW 최소화) 대용량 메모리 사용, 실시간 응답이 중요한 서비스