GC란?
힙 영역의 자바 객체중 사용하지 않거나 참조하지 않은 객체를 처리(쓰레기 수집)하는 프로세스이다.
Stop-the-world(STW)란?
GC가 안전하게 메모리를 조작하기 위해 모든 애플리케이션 스레드를 일시 정지 시키는 것
즉, GC에 집중하는 것이다.
mark-sweep-compact란?
GC 대상 객체를 식별(mask), sweep(제거), compact(압축)
compact를 하는 이유는 메모리 단편화를 없애기 위해서이다.
GC가 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아 마킹하고 그외를 sweep한다음 compact한다.
GC의 종류
Serial GC
- Young GC : stop-the-world 후 single Thread로 mark-copy(Survivor or Old 영역으로 복사)
- Old GC : mark-sweep-compact
- 모든 GC 작업을 1개의 쓰레드로 수행
- STW 시간이 매우 길다.
- JVM option : -XX:+UseSerialGC
Parallel GC
- Young GC : STW + 다중 쓰레드로 병렬 GC
- Old GC : STW + 병렬 mark-sweep-compact
- GC중 STW존재하지만 GC 속도가 매우 빠름
- Batch, 대규모 연산 처리시 유용
JVM option : -XX:+UseParallelGC
CMS (Concurrent Mark Sweep) - Deprecated
- Old GC를 멈추지 않고(STW X) 대부분을 병행 처리
- GC Root에서 직접 연결된 Old 객체만 표시(mask)
- 초기(root mark)와 마지막 단계만 짧게 STW (짧음)
- JVM option : -XX:+UseParallelGC
단점
- Heap 단편화, Compact단계가 없어 메모리 누수
- 이로인한 Full GC 발생 시 시간 폭증
GC1 (Default)
- 현재 JVM 기본 GC
- Heap을 일정 크기의 Region 단위로 쪼개 관리
- Young/Old 구분을 region 기반으로 동적으로 조절
- Pause time 목표에 따라 GC가 튜닝됨
장점
- STW 크게 줄어듦
- 단편화 X
- Mixed GC 기반(Young, 일부 Old 영역 동시 수집), Old GC도 STW 최소화
- 기본값으로 튜닝 부담 적음
단점
Latency 측면에서 ZGC / Shenandoah 보다 느림
- 내부적으로 구조가 복잡 (메모리 오버헤드 존재)
- JVM option : -XX:+UseG1GC (기본값이라 따로 설정 안해도 됨)
ZGC
- 대부분 GC 작업을 애플리케이션과 병행 수행
- STW 시간은 1ms 미만
- Colored Pointer + Load Barrier 기술 사용
- 매우 큰 힙(TB단위)도 낮은 지연 유지 가능
장점
- 멈추지 않는 GC
- 대용량 Heap에 강점
- GC puase(STW) 문제를 완전히 해결하는 수준
단점
- G1 보다 CPU/메모리 오버헤드 큼
- 작은 힙에서 비효율 가능성 O
- JVM option : -XX:+UseZGC
Shenandoah
- Pause time 1~10ms 수준
- ZGC보다 구현 간단
- JVM option : -XX:+UseShenandoahGC
장점
- ZGC와 비슷하게 STW 초 저지연
- Relocation 도 병행 처리
단점
- 일부 JDK 배포판에서만 기본 포함 (AdoptOpenJDK, RedHat JDK)
세대별 GC 동작 방식
Minor GC
Young Generation(Eden + Survivor)에서만 발생하는 GC
특징
Eden 대부분 금방 죽는 객체 이므로 mark-copy로 빠르게 수집
매우 짧은 STW
Old 영역에는 영향이 거의 없음
survivor가 꽉 차면 일부가 Old로 승격 : promotion
발생 시기
Eden 공간 부족시 Minor GC 실행
비용
빠르고 Pause가 짧다.
Major GC
Old Generation 대상 GC
특징
Old 영역 공간 부족시 실행
전통적인 HotSpot(CMS/Parallel) 기준
Full GC
Heap 전체를 STW 상태에서 처리하는 GC
특징
STW 길이가 가장 길기에 비용적으로 매우 비쌈
객체 mark -> sweep -> compact 까지 포함
발생 시기
Promotion failure (survivor -> old 이동 실패)
Old 영역이 꽉 차서 free region이 없을 시
System.gc() 호출
CMS failure
G1에서 evacuation failure
메타스페이스 부족
GC는 전부 STW를 가진다.
'JAVA' 카테고리의 다른 글
| GC 로그 찍어서 분석해보기 (0) | 2025.11.24 |
|---|---|
| G1 GC (0) | 2025.11.24 |
| 정규표현식 (0) | 2025.03.06 |
| ENUM - 열거형 (0) | 2025.02.10 |
| 배열의 복사 : clone() 메서드 자바 (0) | 2024.09.03 |