← ECS Fargate 모니터링
📈

05 / 06

대시보드

Grafana JVM 메모리 대시보드 구성, 메트릭 분석 리포트 형식

GrafanaDashboardReport
아키텍처도입 배경JVM 메트릭ecs-discovery대시보드일정 & 비용

Dashboard

모니터링 대시보드 구성

Grafana를 활용하여 JVM 메모리 관련 대시보드를 구성하고, 수집된 지표를 시각적으로 분석한다. 대시보드는 크게 Heap Memory 문제, Non-Heap Memory 문제, Thread 문제의 3가지 영역으로 나누어 각 영역별 핵심 지표와 Grafana 패널을 구성하였다.

Heap Memory

Heap Memory 문제

Heap Memory 구조

1. Heap OOM 문제

JVM의 Heap 메모리가 꽉 차면 더 이상 객체를 생성할 수 없어java.lang.OutOfMemoryError: Java heap space가 발생한다. GC가 메모리를 회수하지 못하면 요청 처리 실패 및 서비스 장애로 이어진다.

원인

  • • 메모리 누수 — 참조가 해제되지 않은 객체가 Heap에 남아있을 때
  • • 데이터 증가 — 요청 처리량 증가, 캐시/버퍼 누적, 잘못된 객체 생명주기 관리
  • • GC 실패 — GC가 충분히 회수하지 못할 때

Grafana 참고 지표

jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}

→ 80~90% 이상 지속 시 위험

Heap Used 관련 Grafana 지표

2. Committed 확장 오버헤드

JVM은 Heap이 부족할 경우 OS로부터 메모리를 추가 커밋(commit)해서 사용하는데, 이때 발생하는 메모리 확장 작업은 느리고 오버헤드가 크며 GC와 겹치면 성능 저하를 유발한다.

원인

  • • Xms(초기 힙 크기)가 작게 설정되어 점진적 커밋 메모리 확보가 필요할 때
  • • 애플리케이션 메모리 사용량이 빠르게 증가해서 확장 타이밍이 늦어지는 시점

Grafana 참고 지표

jvm_memory_used_bytes{area="heap"} / jvm_memory_committed_bytes{area="heap"}
JVM 메모리 관련 Grafana 지표

3. Full GC 발생

Full GC는 JVM 전체 메모리 정리 작업으로, 이때 모든 Thread가 멈추는 Stop-the-World가 발생한다. OOM 직전 증상이며, 서비스 먹통을 유발할 수 있다.

발생 조건

  • • Old 영역(Tenured Generation)이 가득 찼을 때
  • • Heap 전체가 부족할 때 (Young GC로 해결 불가능한 경우)
  • • Metaspace가 부족할 때

Grafana 참고 지표

jvm memory pools 지표 (Eden Space, Survivor Space, Tenured Gen)

jvm_gc_pause_seconds_max
JVM Memory Pools Grafana 지표
GC Pause Duration Grafana 지표

Non-Heap Memory

Non-Heap Memory 문제

1. Metaspace OOM

JVM의 Metaspace는 클래스 메타데이터(클래스 정의, 상속, 메서드 정보 등)를 저장한다. 동적 클래스 로딩이 많거나 ClassLoader 누수가 발생할 경우 메모리가 지속적으로 누적되어OOM: Metaspace 에러가 발생하며 앱이 강제 종료된다.

Grafana 참고 지표

JVM Metaspace / ClassLoading

→ 클래스 수 지속 증가 → 클래스 로더 누수 가능 → Metaspace 메모리 증가 → OOM 위험

ClassLoading 관련 Grafana 지표

2. Direct Buffer 누수 / Native Memory 과사용

Netty, Kafka 등에서 사용하는 Direct Buffer는 Heap이 아닌 Native 메모리(Off-heap)에 저장된다. 지속적인 누수 또는 크기 초과 사용 시 OS 메모리 부족으로 컨테이너가 OOMKill 될 수 있다.

원인

  • • DirectBuffer 사용 후 명시적으로 해제되지 않음
  • • MaxDirectMemorySize 제한 미설정

Grafana 참고 지표

Buffer Pools — 현재 생성된 버퍼 객체의 수, 현재 사용 중인 버퍼 메모리 크기

Buffer Pool 관련 Grafana 지표

Thread

Thread 문제

1. Thread Leak

새로 생성된 스레드가 종료되지 않고 계속 유지됨 → JVM의 총 스레드 수 증가, native thread 자원 고갈

원인: 스레드 풀 미사용, 무한 루프, 외부 리소스 대기 후 미종료

2. Blocked 상태 Thread 증가

여러 스레드가 동일한 락(lock)을 기다리는 상태로 정체됨 → 응답 지연, 데드락 위험

원인: synchronized 블로킹, DB 커넥션 락, Deadlock 발생

3. Runnable 수 증가

과도한 요청 또는 반복 작업으로 많은 스레드가 실행 대기 → CPU 과점유, Context Switching 증가 → 성능 저하

원인: 트래픽 급증, ThreadPool 과소 설정, 타임아웃 없음

Grafana 참고 지표

jvm_threads_live, jvm_threads_peak, jvm_threads_states{state="blocked"}, jvm_threads_states{state="runnable"}
Thread 관련 Grafana 지표
ecs-discovery일정 & 비용