728x90
반응형

📋 G1 GC 관리 항목별 Default 값 및 권장 설정 (CPU 2core / Memory 4GB)

항목JVM 옵션Default 값설명2Core/4GB 권장값
💡 최대 멈춤 시간 목표 -XX:MaxGCPauseMillis 200ms GC 한 번당 최대 멈춤 시간 목표 (Soft 목표) 그대로 사용 (200ms)
💡 초기/최대 힙 크기 -Xms, -Xmx 초기: 시스템 결정
최대: 1/4 메모리 정도
전체 JVM 힙 크기 -Xms512m -Xmx1024m
💡 G1 Region 크기 -XX:G1HeapRegionSize 자동: 1MB ~ 32MB
(기본은 1MB)
힙을 나누는 단위 (2^n 크기, 보통 2048개 Region 구성됨) 기본값 사용 (1MB)
💡 Mixed GC 트리거 비율 -XX:InitiatingHeapOccupancyPercent 45 Old 영역이 힙의 몇 % 찰 때 Mixed GC 수행 30 ~ 40
💡 Survivor 비율 -XX:SurvivorRatio 8 → Eden:Survivor = 8:1:1 Eden과 Survivor 비율 조정 기본 유지
💡 Tenuring Threshold
(Old로 가는 나이)
-XX:MaxTenuringThreshold 15 객체가 Survivor에서 몇 번 살아남아야 Old로 이동 10~15, 기본 유지
💡 Metaspace 크기 제한 -XX:MetaspaceSize, -XX:MaxMetaspaceSize 제한 없음 (MaxMetaspaceSize 없음) 클래스 메타데이터 공간 -XX:MaxMetaspaceSize=256m
💡 GC 병렬 쓰레드 수 -XX:ParallelGCThreads OS core 수 = 2 GC 수행 시 사용하는 쓰레드 수 그대로 사용
💡 동시 GC 쓰레드 수 -XX:ConcGCThreads 약 1/4 core 수 (1개) Concurrent GC 단계에서의 쓰레드 수 그대로 사용
💡 GC 로그 -Xlog:gc* or -Xloggc 로그 없음 (출력 안 함) GC 분석을 위해 수동 지정 필요 -Xlog:gc*:file=gc.log
 

🧪 권장 JVM 실행 예시 (2Core / 4GB 기준)

java \
  -Xms512m \
  -Xmx1024m \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:InitiatingHeapOccupancyPercent=35 \
  -XX:MaxMetaspaceSize=256m \
  -Xlog:gc*:file=gc.log:time,uptime,level,tags \
  -jar myapp.jar

🧠 추가 팁

상황조치 방안
애플리케이션이 GC 중 자주 멈춘다 -Xmx를 줄여서 GC 대상 자체를 줄이거나 PauseMillis를 늘림
메타스페이스가 부족하다 -XX:MaxMetaspaceSize 증가 또는 클래스로딩 방식 점검
Full GC가 자주 발생한다 객체 수명 길이 확인, 캐시 객체 또는 ThreadLocal 누수 의심
 
반응형

🧭 G1 GC 관리의 핵심 포인트


1. ✅ 멈춤 시간 목표 설정 (Pause Time Goal)

  • 핵심 옵션:
  • -XX:MaxGCPauseMillis=200
  • 설명:
    GC가 한 번 실행될 때의 멈춤 시간 상한값을 설정합니다. 단위는 ms.
  • 관리 포인트:
    • 너무 짧게 설정하면 많은 Region을 수집하지 못하고 GC가 자주 발생해 성능 저하
    • 너무 길게 설정하면 사용자 체감이 느려짐 (지연 시간 증가)

2. ✅ Region 크기와 힙 구성 제어

  • 핵심 옵션:
  • -XX:G1HeapRegionSize=8m -Xms4g -Xmx8g
  • 설명:
    • 힙은 고정된 크기의 Region으로 나뉘고, 최소 1MB ~ 최대 32MB (기본은 힙 크기에 따라 자동)
  • 관리 포인트:
    • 너무 작은 Region은 관리 오버헤드 증가
    • 너무 크면 세밀한 수집이 어려움
    • 적정 Region 수는 보통 2048 ~ 4096개 사이

3. ✅ Old 영역 진입 시점 조절

  • 핵심 옵션:
  • bash
    복사편집
    -XX:InitiatingHeapOccupancyPercent=45
  • 설명:
    Old 영역이 전체 힙에서 몇 %를 차지할 때 Mixed GC를 트리거할지 결정
  • 관리 포인트:
    • 너무 늦으면 Old가 가득차 Full GC 발생
    • 너무 빠르면 자주 Mixed GC가 발생해 오버헤드

4. ✅ Tenuring Threshold 조절 (Survivor → Old 이동)

  • 핵심 옵션:
  • -XX:MaxTenuringThreshold=10
  • 설명:
    객체가 Survivor에서 살아남아 Old로 넘어가는 시점 결정
  • 관리 포인트:
    • 너무 낮으면 객체가 빨리 Old로 넘어가 Old가 빨리 차고 GC 잦아짐
    • 너무 높으면 Survivor 공간 부족 가능

5. ✅ GC 로그 기반 모니터링

  • 핵심 옵션:
  • -Xlog:gc*:file=gc.log:time,level,tags
  • 관리 포인트:
    • Young GC 빈도, Mixed GC 빈도, Full GC 여부 확인
    • 멈춤 시간(Pause Time)과 수집된 Region 수 확인

6. ✅ 클래스/Metaspace 관리

  • 핵심 옵션:
  • -XX:MaxMetaspaceSize=512m
  • 설명:
    • G1 GC는 메타스페이스도 관리 대상이므로, 클래스 누수/과다 로딩 주의
  • 관리 포인트:
    • 빈번한 동적 로딩 시, 클래스 로더 메모리 증가 → Full GC 유발 가능

7. ✅ 병렬 처리 설정 (멀티코어 대응)

  • 핵심 옵션:
  • -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4
  • 설명:
    • GC 작업을 병렬로 처리할 수 있는 쓰레드 수 지정 (기본은 CPU 수에 비례)
  • 관리 포인트:
    • CPU 8개 이상인 경우 명시적으로 쓰레드 수 조정해 GC 성능 향상

📋 G1 GC 관리 요약표

 
관리 항목 JVM 옵션 예시목표 / 효과
멈춤 시간 설정 -XX:MaxGCPauseMillis=200 응답성 향상
Region 크기 조정 -XX:G1HeapRegionSize=8m GC 제어 정밀도 향상
Old GC 트리거 시점 -XX:InitiatingHeapOccupancyPercent=45 Full GC 예방
객체 수명주기 조절 -XX:MaxTenuringThreshold=10 Old 영역 과부하 방지
로그 기반 분석 -Xlog:gc*:file=gc.log:... 병목 원인 추적
Metaspace 제한 -XX:MaxMetaspaceSize=512m 클래스 메모리 제어
병렬 GC 쓰레드 설정 -XX:ParallelGCThreads=4 멀티코어 최적화
 

🔚 마무리

G1 GC는 자동 조정 기능도 강력하지만, 아래와 같은 상황에서는 명시적 튜닝이 매우 중요합니다:

  • 힙이 8~32GB 이상인 서버 애플리케이션
  • GC 로그에서 Mixed GC 또는 Full GC가 자주 발생
  • 사용자 응답 시간 민감 (웹서버, API 서버 등)
728x90
반응형

+ Recent posts