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
반응형
'Java' 카테고리의 다른 글
Spring WebFlux의 WebClient 기반의 CircuitBreaker 및 Retry 기능을 적용한 실무 예제 (1) | 2025.06.16 |
---|---|
RetryTemplate 과 CircuitBreaker (0) | 2025.06.16 |
G1 GC 영역 (Eden, Survivor, Old Gen) (0) | 2025.05.14 |
트랜잭션이 적용되지 않고 AutoCommit 상태일 때 발생할 수 있는 문제점 (0) | 2025.05.14 |
@Transactional 어디에 위치시켜야하나? (0) | 2025.05.14 |