JAVA

GC (Garbage Collection)

Meluu_ 2025. 11. 21. 19:13

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