Technical NOTE
G1 GC 에 대해 본문
반응형
G1 GC (Garbage First Garbage Collector)는 Java 7부터 도입된 Garbage Collector로, 대용량 힙 메모리를 효율적으로 관리하는 데 중점을 둔 저지연(低遲延) GC입니다. G1 GC는 Stop-the-world (STW) 시간을 줄여 애플리케이션의 응답성을 높이고, 힙 메모리를 효과적으로 관리하여 메모리의 단편화 문제를 줄이는 것을 목표로 설계되었습니다.
G1 GC의 주요 특징
- Region 기반 힙 관리:
- G1 GC는 전체 힙 메모리를 고정된 크기의 여러 개의 영역(Region)으로 나눕니다. 각 Region은 1MB에서 32MB 사이의 크기를 가지며, Eden, Survivor, Old 영역의 역할을 할 수 있습니다.
- 이로 인해 연속된 메모리 블록을 할당해야 하는 기존 GC의 단점(메모리 단편화)을 해결하고, 필요한 영역만 수집할 수 있어 효율적입니다.
- Young Generation & Old Generation:
- G1 GC는 Eden 영역, Survivor 영역, Old 영역으로 힙을 나누어 관리합니다. 젊은 객체들은 Young Generation에서 할당되며, 살아남은 객체는 Old Generation으로 이동합니다.
- Young 영역은 주로 작고 짧은 생명주기를 가진 객체들이 생성되며, Old 영역에는 오랫동안 살아남은 객체들이 저장됩니다.
- Garbage First(G1) 수집 방식:
- G1 GC는 우선적으로 가장 많은 가비지(쓸모없는 객체)가 있는 영역부터 수집합니다. 이를 통해, 최대한 많은 가비지를 짧은 시간 안에 처리하려고 합니다. 이 방식은 응답 시간 예측을 더 잘 할 수 있게 해주며, 애플리케이션의 지연 시간(Latency)을 줄여줍니다.
- Mixed GC:
- G1 GC는 Young GC와 Old GC가 결합된 Mixed GC 방식을 사용합니다. Young 영역 수집 외에도, Old 영역의 일부를 동시에 수집하여 힙 메모리의 증가 속도를 늦추는 역할을 합니다.
- 이를 통해 Full GC의 발생 빈도를 줄여주며, Old 영역을 더 효율적으로 관리할 수 있게 해줍니다.
- Concurrent Marking:
- Old 영역의 객체 수집을 위해 G1 GC는 Concurrent Marking(동시 마킹) 단계를 도입했습니다. 이는 애플리케이션 실행 중에도 가비지를 마킹하여, 객체의 생존 여부를 비동기적으로 판단합니다.
- 이로 인해 Stop-the-World (STW) 시간이 줄어들고, 애플리케이션의 성능 저하를 최소화할 수 있습니다.
- Pause Time 목표 설정:
- G1 GC는 최대 허용 지연 시간(최대 중단 시간)을 목표로 동작합니다. 개발자는 JVM 옵션을 통해 목표 지연 시간을 설정할 수 있으며, G1 GC는 해당 시간 내에 수집 작업을 완료하도록 최적화합니다.
- 예를 들어,
-XX:MaxGCPauseMillis=200
과 같이 설정하면, G1 GC는 GC 중단 시간을 200밀리초 이내로 유지하려고 노력합니다.
- 압축(Compaction):
- G1 GC는 힙 메모리의 단편화를 방지하기 위해 사용되지 않는 Region을 합쳐 압축합니다. 기존 GC 방식의 Full GC가 단편화를 해소하려면 긴 시간이 필요했지만, G1 GC는 점진적으로 압축을 수행하여 애플리케이션의 중단 시간을 줄입니다.
G1 GC의 작동 단계
- Young GC (Minor GC):
- Young 영역에서 주로 Eden과 Survivor 영역의 객체를 수집합니다.
- 이 과정에서는 STW(Stop-the-World) 이벤트가 발생하지만, 짧은 시간 안에 완료되어 애플리케이션의 성능에 큰 영향을 미치지 않습니다.
- Eden 영역에 객체가 가득 차면 Young GC가 발생하고, 생존한 객체들은 Survivor 영역으로 이동합니다. 여러 번의 Young GC를 거친 후에도 살아남은 객체는 Old 영역으로 이동합니다.
- Concurrent Marking (동시 마킹):
- Old 영역에서 사용되지 않는 객체를 수집하기 위해 객체 생존 여부를 마킹하는 단계입니다.
- 이 단계는 애플리케이션 실행과 동시에 진행되며, STW 시간이 짧습니다. 살아있는 객체는 마킹되고, 마킹되지 않은 객체는 가비지로 인식되어 이후 Mixed GC에서 수집됩니다.
- Mixed GC:
- Young 영역과 함께 Old 영역의 일부도 함께 수집합니다.
- G1 GC는 전체 Old 영역을 한 번에 수집하지 않고, 사용되지 않는 Region들만 선택적으로 수집합니다. 이를 통해 Full GC의 발생 빈도를 줄이고, 메모리를 효율적으로 관리할 수 있습니다.
- Full GC:
- G1 GC는 일반적으로 Full GC를 피하려고 설계되었지만, 힙 메모리가 가득 차거나 더 이상 공간을 확보할 수 없을 때 Full GC가 발생할 수 있습니다.
- Full GC는 STW 이벤트로, 모든 애플리케이션 스레드를 멈추고 GC 작업을 진행하므로 가장 긴 중단 시간을 초래할 수 있습니다.
G1 GC의 장단점
장점 | 단점 |
---|---|
저지연성: STW 시간을 줄여 응답성 향상 | Heap이 작을 경우 효과가 크지 않음 |
대용량 힙에서 효과적 | Full GC 발생 시 긴 중단 시간 |
Concurrent Marking으로 중단 시간 최소화 | 설정에 따른 추가 튜닝이 필요 |
압축을 통해 단편화 문제 해결 | CPU 리소스를 많이 사용할 수 있음 |
Mixed GC로 Old 영역까지 관리 | 고정된 목표 지연 시간 유지가 어려울 수 있음 |
G1 GC를 사용할 때 고려할 점
- 힙 크기:
- G1 GC는 주로 대용량 힙 메모리에서 효과적입니다. 4GB 이상의 힙을 사용할 때 G1 GC가 성능 최적화에 도움이 됩니다.
- 힙이 작은 경우(예: 2GB 이하)에는 G1 GC의 성능 이점이 크지 않으며, 오히려 오버헤드가 발생할 수 있습니다.
- 지연 시간 목표:
- 응답 시간이 중요한 애플리케이션(예: 웹 애플리케이션)에서 G1 GC가 매우 유용합니다. 지연 시간 목표를 적절하게 설정하고, 이를 유지하기 위한 JVM 옵션 튜닝이 필요합니다.
- CPU 사용량:
- G1 GC는 CPU를 많이 사용하는 방식입니다. 따라서 멀티코어 환경에서 더 효율적입니다. CPU 코어가 부족한 경우에는 GC 오버헤드가 발생할 수 있습니다.
- 튜닝 필요성:
- G1 GC는 JVM 옵션으로 지연 시간 목표(MaxGCPauseMillis), 히프 크기(Xmx, Xms), 가비지 수집 빈도 등을 세밀하게 조정해야 최적의 성능을 낼 수 있습니다.
G1 GC 설정 및 JVM 옵션
G1 GC는 다음과 같은 JVM 옵션을 통해 설정 및 튜닝할 수 있습니다:
-XX:+UseG1GC # G1 GC 활성화
-XX:MaxGCPauseMillis=<N> # 최대 중단 시간을 N 밀리초로 설정
-XX:InitiatingHeapOccupancyPercent=<N> # Old 영역의 가비지 수집을 시작하는 힙 점유율
-XX:G1NewSizePercent=<N> # Young Generation의 크기를 힙의 N%로 설정
-XX:G1ReservePercent=<N> # Old 영역에서 미리 확보해둘 메모리 비율
예시:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xms4g -Xmx8g -jar myapp.jar
위 설정은 G1 GC를 사용하고, 최대 200ms의 중단 시간을 목표로 하며, 초기 힙 크기 4GB, 최대 힙 크기 8GB로 설정한 JVM 옵션이다.
반응형
'미들웨어 > JEUS' 카테고리의 다른 글
ZGC 사용시 주의해야할 점과 적합한 환경 검토 (1) | 2024.09.27 |
---|---|
ZGC 에 대하여 (1) | 2024.09.27 |
SpringFramework 버전별 JavaEE(JakartaEE) 버전 정리 (0) | 2024.09.24 |
전자정부 표준프레임워크 4.2 - JEUS 호환성 (0) | 2024.09.05 |
JEUS 버전별 JDK 호환 버전 목록 (0) | 2024.09.04 |