spring-boot actuator의 메트릭 정보와 grafana dashboard(+prometheus)를 이용해서 다양한 정보를 모니터링할 수 있다.
해당 정보 중에서 오늘은 GC 관련된 dashboard를 확인해 보자.
grafana의 dashboard를 직접 작성하지 않고 이미 작성된 유용한 내용들을 import해와서 사용할 수 있는데
오늘은 아래 dashboard에서 제공하는 내용을 살펴보자.
https://grafana.com/grafana/dashboards/11378-justai-system-monitor/
각각 그래프를 나타내기 위한 지표는 아래와 같다
GC count : jvm_gc_pause_seconds_count
GC stop the world duration max : jvm_gc_pause_seconds_sum
대략적인 그래프의 제목만 보았을 때는
GC가 발생하는 횟수, GC 발생 시 STW 소요 시간으로 대략적으로 어떤 내용을 나타내는지 이해가 된다.
하지만 그래프에서 나타내는 값들은 생소하다.
각각의 값들이 어떠한 의미인지 확인해 보자.
위의 그래프는 java17 버전의 appliaction 지표로 GC는 기본값인 G1 GC를 이용하고 있다.
1. G1 Evacuation Pause
- 의미: 일반적인 Minor GC 발생 시, 살아 있는 객체를 Eden → Survivor 또는 Old 영역으로 이동시키는 과정에서 발생하는 일시적인 정지(pause)
- 영향: 애플리케이션의 짧은 일시 중단이 발생할 수 있음
2. G1 Humongous Allocation
- 의미: 큰 객체(Humongous Object, Heap의 Region 크기의 50% 이상)가 할당될 때, 해당 객체를 저장할 충분한 연속된 메모리가 없으면 GC가 발생
- 영향: 크기가 큰 객체가 메모리를 많이 차지하여 GC가 더 자주 발생할 수 있음
3. G1 Preventive Collection
- 의미: G1 GC는 예측 기반으로 동작하는데, 앞으로 발생할 Full GC를 방지하기 위해 사전적으로 Minor GC를 실행할 수도 있음
- 영향: 성능 최적화를 위한 예방적 GC이지만, 예상보다 자주 실행되면 성능에 영향을 줄 수 있음
4. Metadata GC Threshold
- 의미: Java의 메타데이터 영역(클래스 정보 등)을 관리하는 Metaspace가 특정 임계값을 초과하면, 이를 정리하기 위해 Minor GC가 트리거
- 영향: Metaspace가 커지면 GC가 자주 발생할 수 있음
JVM을 학습하면서 익혔던 많은 개념들이 등장한다 (minorGC, eden, survivor, metaspace..)
추가적으로 궁금한 사항은 Humongous allocation에 대한 내용인데, 큰 객체의 기준이 무엇일까?
-> G1 GC의 Heap Region 크기의 50% 이상인 객체
-> G1 GC의 경우 heap 영역을 region으로 나누어 관리한다는 전제를 이해해야 한다.
-XX:G1HeapRegionSize 옵션을 통해 크기를 조정할 수 있다(성능 튜닝 포인트)
하지만, 보통의 경우에는 지정하지 않고 사용하기 때문에 기본값이 무엇인지 알아보자.
Region 크기 결정 방식
JVM이 자동으로 결정하는 경우, Heap 크기에 따라 Region 크기가 변동
전체 Heap 크기 |
기본 Region 크기 |
<= 1GB |
1MB |
1GB ~ 2GB |
2MB |
2GB ~ 4GB |
4MB |
4GB ~ 8GB |
8MB |
8GB ~ 16GB |
16MB |
16GB 이상 |
32MB |