G1 GC vs CMS GC

2025. 7. 26. 21:01·JAVA

GC 개요

항목 CMS GC G1 GC
전체 이름 Concurrent Mark Sweep GC Garbage First GC
기본 전략 세대 구분 (Young / Old) + 병행 수집 Region 기반 + 논리적 세대 구분 + 병행 수집 + compact
STW(Stop-The-World) 일부 발생 (Young GC, Initial Mark 등) 일부 발생 (Young GC, Remark 등)
단편화 해소 ❌ 없음 ✅ 있음 (Evacuation + Compaction)
JVM 옵션 -XX:+UseConcMarkSweepGC -XX:+UseG1GC (JDK 9 이상 기본값)
대상 영역 고정된 Young/Old Generation 논리적 Young/Old, Region 기반 동적 분할

CMS GC 상세 동작

구조

Heap
├── Young Generation
│   ├── Eden
│   └── Survivor (S0, S1)
└── Old Generation

동작

  1. Minor GC (Young 영역): ParNew GC가 수행 (Copying 방식)
  2. Major GC (Old 영역): CMS가 수행
    • Initial Mark (STW)
    • Concurrent Mark (병행)
    • Remark (STW)
    • Concurrent Sweep (병행)
    • ✅ Compact 없음 → 단편화 발생 가능

장점

  • Major GC 중 대부분 병행 수행
  • GC pause 시간 짧음 (Throughput보다는 latency 중심)

단점

  • 단편화 발생: Compact 단계 없음 → Old 영역에서 연속 공간 부족 시 Full GC 강제 발생
  • 병행 수행 중 애플리케이션 스레드와 경쟁 → 성능 불안정
  • 메타스페이스는 GC 대상 아님 → CMS는 PermGen 시절의 GC 정책에 기반
  • 개발 중단됨 (deprecated): JDK 14에서 완전 제거

G1 GC 상세 동작

구조 (Region 기반)

Heap: 수백 개의 동일 크기 Region
├── Eden Region
├── Survivor Region
├── Old Region
├── Humongous Region
  • 각 Region은 역할이 동적으로 할당됨
  • Eden, Survivor, Old 구분은 논리적

동작

  1. Young GC (Minor GC)
    • Eden → Survivor로 복사 (Copying GC)
    • STW 발생
  2. Old GC (Mixed GC)
    • Young + 일부 Old 영역을 함께 GC
    • Mark 단계는 병행 수행:
      • Initial Mark (STW)
      • Concurrent Mark
      • Remark (STW)
      • Cleanup (선택된 Region만)
      • Copy (Evacuation, STW)

장점

  • 단편화 자동 해결 (Region 단위 이동 + Compacting)
  • GC 대상 영역을 부분 선택 가능 → 성능 예측 용이
  • GC pause 시간 예측 가능 (-XX:MaxGCPauseMillis=200 등)
  • 서버 환경에서 기본값 (JDK 9부터 기본 GC)

단점

  • JVM 힙이 작을 경우 오히려 비효율적일 수 있음
  • 매우 짧은 pause time 요구엔 ZGC, Shenandoah가 더 우수함

CMS의 문제점 정리

문제 설명
단편화 발생 Compact 단계가 없어 Old 영역에 조각난 메모리만 남음
Full GC 발생 단편화가 심하면 Promotion 실패 → Full GC로 이어짐
성능 예측 어려움 GC 시간과 간섭이 불규칙함
Deprecated JDK 9에서 deprecated, JDK 14에서 완전 제거됨

왜 G1이 CMS를 대체했는가?

항목 이유
단편화 해결 G1은 Region을 이동시키며 자동 압축(Compaction)을 수행
GC 시간 예측 가능 MaxGCPauseMillis 등으로 GC pause 시간 조정 가능
안정성 병행/병렬 처리 균형 잡힌 구조 + 고성능 서버에 최적화
유지보수성 Oracle이 공식 지원하는 GC, CMS는 더 이상 관리되지 않음
기본 GC JDK 9부터 서버용 JVM의 기본 GC로 채택됨

✅ 결론 요약

  • CMS는 저지연 애플리케이션에 적합했지만, 단편화 문제, Full GC 발생 위험, Deprecated 등의 이유로 점차 퇴출됨
  • G1 GC는 이를 보완하여 부분 GC + 병행 + 압축 + 예측 가능한 GC 시간을 제공
  • 현대 JVM에서는 G1이 CMS를 완전히 대체함

'JAVA' 카테고리의 다른 글

GC(Garbage Collection)  (2) 2025.07.26
Stack vs Heap  (1) 2025.07.10
스레드와 멀티스레드  (0) 2025.07.07
JMM  (0) 2025.07.07
JIT(Just-In-TIme) Complination  (4) 2025.07.07
'JAVA' 카테고리의 다른 글
  • GC(Garbage Collection)
  • Stack vs Heap
  • 스레드와 멀티스레드
  • JMM
moonwhistle
moonwhistle
  • moonwhistle
    OrangeBanana
    moonwhistle
  • 전체
    오늘
    어제
    • 분류 (113)
      • [Spring] - Study (11)
        • CS (0)
        • Project - 모각밥(모여서 각자 밥먹기) (7)
        • Project - CoinFlow(비트코인 차트) (4)
      • 오픈소스 (1)
      • 📖 DB (1)
      • JAVA (6)
      • 우아한테크코스[프리코스] (15)
      • [Spring] - 멘토링 (30)
        • 미션 (13)
        • 개념 (16)
      • 알고리즘 (2)
      • 💬 생각생각 (3)
        • F-lap (2)
      • 통신 (34)
        • 네트워크 프로토콜 (18)
        • 데이터통신 (16)
      • 용접 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 카테고리
    • 초록스터디
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    data
    GC
    코인
    Java
    KAFKA
    동시성
    volatile
    에프랩
    redis
    트랜잭션
    Flow
    F-Lab
    spring
    후기
    멀티모듈
    garbage collection
    jmm
    설계
    Synchronized
    multimodule
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
moonwhistle
G1 GC vs CMS GC
상단으로

티스토리툴바