프로젝트 상담

INSIGHTS · Technology

Java 서버 OOM 문제 분석: 메모리 누수와 Heap 설정 구분하기

BLICT · 2026. 10. 27. · 수정 2026. 10. 27.

Java 서버에서 OOM이 발생하는 원인을 메모리 누수, Heap 설정, Direct Memory 등으로 구분하는 방법과 Heap Dump 및 GC 로그 분석 방법에 대해 알아봅니다.

OOM(OutOfMemoryError) 이해하기

Java 서버에서 OOM 오류는 흔히 발생하는 문제로, 애플리케이션의 안정성을 크게 저해할 수 있습니다. OOM 오류는 JVM이 더 이상 사용할 수 있는 힙 메모리를 초과할 때 발생하며, 이러한 상황은 여러 가지 원인으로 발생할 수 있습니다. 메모리 누수, 잘못된 Heap 설정, Direct Memory 사용 증가 또는 스레드 수의 증가 등이 그 원인으로 작용할 수 있습니다. 따라서, 문제의 근본 원인을 파악하는 것이 중요합니다.

메모리 누수는 특정 객체가 더 이상 필요하지 않음에도 불구하고 가비지 컬렉터(GC)가 해당 객체를 수집하지 못하는 경우 발생합니다. 반면에 Heap 설정 문제는 JVM의 초기 및 최대 힙 크기 설정이 적절하지 않은 경우에 발생합니다. 이를 통해 OOM 오류의 원인을 구분할 수 있는 기초를 마련할 수 있습니다.

Heap Dump 분석

Heap Dump는 JVM의 힙 메모리 상태를 스냅샷으로 저장한 파일입니다. OOM이 발생했을 때 Heap Dump를 생성하여 분석하면, 어떤 객체가 메모리를 과도하게 차지하고 있는지를 파악할 수 있습니다. Heap Dump를 생성하는 방법은 JVM의 -XX:+HeapDumpOnOutOfMemoryError 플래그를 사용하여 OOM 오류 발생 시 자동으로 생성되도록 설정할 수 있습니다.

Heap Dump를 분석하는 도구로는 Eclipse Memory Analyzer (MAT)와 VisualVM이 있습니다. 이 도구들은 Heap Dump 파일을 로드하여 메모리 사용량을 시각화하고, 메모리 누수의 원인을 파악하는 데 도움을 줍니다. 분석 결과를 통해서 불필요한 객체를 정리하거나, 객체 생명 주기를 조정할 수 있습니다.

GC 로그 분석

가비지 컬렉션(GC) 로그는 JVM의 메모리 관리 상태를 추적할 수 있는 중요한 정보입니다. GC 로그를 활성화하면, 메모리의 할당 및 수거 과정에서 발생하는 이벤트를 기록합니다. 이를 통해 GC가 얼마나 자주 발생하는지, 각 GC 사이클에서 얼마나 많은 메모리가 회수되는지를 확인할 수 있습니다.

GC 로그를 분석하기 위해서는 -XX:+PrintGCDetails와 같은 플래그를 사용하여 로그를 기록해야 합니다. 이 로그를 통해서 GC의 성능을 모니터링하고, GC가 메모리 부족 문제를 해결하는 데 효과적인지를 점검할 수 있습니다. GC가 너무 자주 발생하면, 이는 메모리 설정이 적절하지 않거나 메모리 누수가 발생하고 있다는 신호일 수 있습니다.

Direct Memory와 스레드 수 증가

Direct Memory는 Java NIO에서 사용하는 메모리 영역으로, JVM의 힙 메모리와는 별개로 관리됩니다. Direct Memory의 사용량이 증가하면, OOM 오류가 발생할 수 있습니다. 이를 체크하기 위해 -XX:MaxDirectMemorySize 플래그를 사용하여 Direct Memory의 최대 크기를 설정할 수 있습니다. OOM이 Direct Memory에서 발생하는 경우, Heap Dump 분석 시 Direct Memory 사용량도 함께 검토해야 합니다.

스레드 수의 증가 또한 OOM의 원인이 될 수 있습니다. 스레드가 생성될 때마다 스택 메모리가 할당되며, 스레드 수가 지나치게 많아지면 메모리 부족으로 이어질 수 있습니다. 이를 해결하기 위해 스레드 풀을 사용하거나, 스레드 수를 적절하게 조절하는 것이 필요합니다.

OOM 문제 해결을 위한 체크리스트

  • JVM의 Heap 설정을 적절히 조정했는지 확인합니다.
  • 메모리 누수를 의심할 수 있는 코드 경로를 점검합니다.
  • Heap Dump 및 GC 로그를 통해 메모리 사용 패턴을 분석합니다.
  • Direct Memory 사용량을 모니터링하고, 필요 시 설정을 조정합니다.
  • 스레드 수를 관리하고, 스레드 풀을 적절히 활용합니다.

관련 글

Java 서버 OOM 문제 분석: 메모리 누수와 Heap 설정 구분하기 | BLICT