Serial GC
싱글스레드 동작
세대별 이론 기반 동작
영 꽉차면 마이너GC
올드 꽉차면 풀GC
코어가 하나거나 메모리가 1792MB보다 작으면 요게 디폴트
싱글 코어나 사용하는 메모리가 적으면 G1보다 좋음
어차피 코어가 하나면 GC는 CPU를 집중적으로 쓰기 때문에 싱글 스레드로 하는게 좋음 컨텍스트스위칭 비용이없자나
어차피 GC끝날때까지 STW고 그냥 한번에 제대로 끝내는 것
또 코어가 여러개라도 메모리가 엄청작으면 대충 100MB정도면 이게 더 좋음 왜냐하면 병렬로한다고 동기화 비용등 치를바에는 그냥 한번에

Parallel GC
jdk 5~8에서 코어가 2개이상 메모리가 1792MB보다 크면 디폴트였음 (서버클래스)
멀티스레드 동작
모든 코어에 GC를 할당
쓰루풋 = 애플실행시간 / 전체실행시간 = GC가 일어나지않음
쓰루풋 하나는 최강
힙메모리가 상당히크고 코어나 하드웨어 스레드가 많을 때 사용
한번 GC할때 정지 시간이 오래걸려도 전체 스루풋을 줄일 수 있으면 좋은 경우 적절함 (배치등)
에르고노믹스에 가장 효율적

G1GC (Garbage-First GC)
쓰루풋과 정지시간최소화 달성을 동시에 추구하기 위해 나옴
jdk9부터 서버 클래스면 요게 디폴트
(패러렐 GC보단 쓰루풋 낮긴한데 높음 쓰룻풋 그리고 정지시간은 크게 개선됨)
애플리케이션코드와 동시에 수행
일부코어에 GC할당하는 방식 애플리케이션 코드를 실행하는 코드와 병렬가능
STW 발생하긴하나 최소화
세대별 GC로 동작하지만 리전이라는 새로운 개념이 도입됨
ZGC
다양한 힙 사이즈에서도 정지시간 최소화를 보장 1ms미만 정지시간이 힙 사이즈와 독립적
대부분의 GC가 애플리케이션과 동시실행 쓰루풋에서는 조금 손해
금융 주식 거래 게임 대용량 캐시등 레이턴시가 핵심인곳에 적절
jdk15에서 등장 이때는 세대별이론 사용 X jdk21부터 세대별 이론 사용 세대별이론 적용시 스루풋 약 10% 개선
jdk23에서 ZGC의 세대별이론이 디폴트 설정
jdk24에서 ZGC의 세대별이론X버전이 제거됨
CMS GC (concurrent mark sweep)
jdk5에 나옴 현재는 제거됨
과거 패러렐과 시리얼GC의 STW를 극복하기위해 나옴
최초의 동시성 컬렉터 애플리케이션과 동시동작 그러나 STW가 존재하긴함
그러나 컴팩트단계가 없어 단편화 증가 그럼 풀 GC가 싱글스레드로 동작 STW의 시간이 예측 불가능해짐
힙 메모리가 커질수록 이 문제가 커져 삭제됨
Shenandoah GC (시난도어 GC)
ZGC와 유사 정지시간 10ms 이하 보장
레드헷에서 개발 오라클jdk에서는 요거 못씀
중대형 힙 사이즈에 최적화
ZGC는 64비트 운영체제에서만 사용가능한데 이건 32비트에서도 가능
'Java > GC' 카테고리의 다른 글
| 메서드 영역의 GC와 Hibernate의 프록시 생성 로직에 관하여 (0) | 2026.05.15 |
|---|---|
| 풀 GC - 마크 스윕 컴팩트 알고리즘 그림 (0) | 2026.04.23 |
| 마이너 GC - 마크 카피 알고리즘 그림 (1) | 2026.04.09 |
| GC의 힙 메모리 사이즈 동적 변동 (0) | 2026.04.02 |