03 / 06
JVM 메트릭
수집 가능한 JVM 내부 상태 지표, Heap Memory, GC, Thread, Metaspace, CPU 등
JVM Metrics
JVM 메트릭 개요
Prometheus + Grafana 모니터링 체계를 통해 수집 가능한 JVM 내부 상태 지표를 정리한다. ECS Fargate 환경에서는 CloudWatch만으로 JVM 레벨 메트릭을 확인할 수 없기 때문에, Spring Boot Actuator가 노출하는 Micrometer 기반 메트릭을 Prometheus가 수집하여 Heap Memory, GC, Thread, Metaspace, CPU 등 다수의 핵심 지표를 실시간으로 추적한다.
6종+
수집 메트릭
실시간
수집 주기
조기 탐지
장애 예방
Metrics Detail
메트릭 상세
Heap Memory Used / Max
조기 탐지 가능설명
JVM Heap 메모리 사용량 및 최대 할당량
문제 조기 탐지
요청/데이터 증가로 객체 급증, 캐시 또는 버퍼 누적 → OOM 경고 조기 인지
왜 탐지해야 하는가
Heap이 Xmx에 근접하면 Full GC 빈도 증가, 성능 저하, OOM으로 앱 다운 → 미리 경고하면 GC 튜닝 또는 Scale Up 기회 확보
GC Count / Time
조기 탐지 가능설명
GC 동작 횟수 및 소요 시간
문제 조기 탐지
GC 동작 횟수 및 소요 시간 → 불필요한 GC 루프 탐지
왜 탐지해야 하는가
Full GC 반복 = 시스템 멈춤에 가까운 수준의 성능 저하 → GC 시간/횟수 증가 추이 감지하여 메모리 모델 재설계
Thread Count / Peak
조기 탐지 가능설명
현재 Thread 수 및 최대 Thread 수
문제 조기 탐지
Thread 증가 추이 → Thread leak 조짐 탐지
왜 탐지해야 하는가
Thread수가 계속 증가하면 OS 수준의 한계에 도달 → thread leak을 조기에 발견해야
Metaspace Used
조기 탐지 가능설명
클래스 로딩 공간 사용량 (MaxMetaspaceSize 대비)
문제 조기 탐지
클래스 로딩 공간 → MaxMetaspaceSize 부족 파악. 동적 클래스 로딩 반복 탐지
왜 탐지해야 하는가
metaspace는 클래스 메타정보 저장소인데 metaspace 가득 차면 OOM: Metaspace가 발생하고 앱이 죽음 → 미리 사용량 감지하면 MaxMetaspaceSize 조정 가능
Class Loading Count
조기 탐지 가능설명
동적으로 로드된 클래스 수
문제 조기 탐지
동적 클래스 로드 수 → 메모리 부하 유발 코드 탐지
왜 탐지해야 하는가
클래스가 지속적으로 로드되면 Metaspace 사용량이 증가하고, 결국 OOM: Metaspace로 이어질 수 있다
Uptime / CPU Usage
조기 탐지 가능설명
Task별 가동 시간 및 CPU 사용률
문제 조기 탐지
Task별 성능 지표 → 리소스 병목 인지. CPU 스파이크는 GC나 무한 루프의 징후
왜 탐지해야 하는가
CPU 버스트 발생(GC, 반복 루프), 앱 성능 점점 저하, Task별 리소스 과소 할당
Early Detection
문제 조기 탐지
위 JVM 메트릭을 실시간으로 수집하면, 다음과 같은 문제를 장애 발생 전에 조기 탐지할 수 있다.
OOM (OutOfMemoryError) 예방
Heap Memory Used가 Max에 근접하거나 Metaspace 사용량이 급증하면 OOM 발생 전에 경고를 받을 수 있다. GC 튜닝, Scale Up, MaxMetaspaceSize 조정 등의 대응이 가능하다.
GC 성능 저하 감지
GC Count/Time의 증가 추이를 모니터링하면 Full GC 반복으로 인한 Stop-the-World 현상을 조기에 감지할 수 있다. 메모리 모델 재설계나 GC 알고리즘 변경으로 대응한다.
Thread Leak 조기 발견
Thread Count가 지속적으로 증가하는 패턴을 감지하면 Thread Leak을 조기에 발견할 수 있다. OS 수준의 Thread 한계에 도달하기 전에 원인 코드를 수정할 수 있다.
리소스 병목 인지
CPU Usage 스파이크는 GC 과부하나 무한 루프의 징후일 수 있다. Uptime과 함께 분석하면 Task별 리소스 과소 할당 여부를 판단하고 적절한 리소스를 배분할 수 있다.
핵심 요약
CloudWatch의 인프라 레벨 메트릭(CPU, Memory)만으로는 JVM 내부 상태를 파악할 수 없다. Prometheus를 통해 JVM 메트릭을 실시간으로 수집하면, OOM, GC 성능 저하, Thread Leak, 리소스 병목 등의 문제를 장애 발생 전에 조기 탐지하고 선제적으로 대응할 수 있다.