개발/Trouble Shooting

서버가 멈췄다! 자바 OutOfMemoryError(OOME) 완벽 분석 및 해결 가이드

ophelisis 2025. 12. 29. 10:07
반응형

 

1. ❓ OutOfMemoryError란 무엇인가요?

OutOfMemoryError는 자바 가상 머신(JVM)이 힙(Heap) 메모리 등 가용 가능한 메모리 공간이 부족하여 더 이상 객체를 할당할 수 없을 때 발생하는 Error입니다. 앞서 예외(Exception) 종류에서 배웠듯이, 이는 애플리케이션 수준에서 복구하기 힘든 심각한 상태를 의미합니다.


2. 🔍 주요 발생 원인과 종류

OOME는 발생하는 영역에 따라 원인이 제각각입니다. 가장 대표적인 3가지를 살펴볼까요?

에러 메시지 발생 원인 주요 해결 방법
Java heap space 힙 영역에 객체가 가득 참 메모리 누수 점검, -Xmx 옵션으로 힙 크기 증설
GC overhead limit exceeded GC가 너무 자주 발생하지만 회수되는 메모리가 적음 로직 최적화, 불필요한 객체 생성 억제
Metaspace / PermGen 클래스 메타데이터가 가득 참 -XX:MaxMetaspaceSize 상향 조정

3. 🛠️ 실전! OOME 해결 프로세스

Step 1: 힙 덤프(Heap Dump) 분석

가장 먼저 해야 할 일은 메모리의 상태를 '스냅샷'으로 찍는 것입니다.

  • -XX:+HeapDumpOnOutOfMemoryError 옵션을 설정해두면 에러 발생 시 자동으로 덤프 파일이 생성됩니다.
  • **Eclipse MAT(Memory Analyzer Tool)**이나 VisualVM 같은 도구를 사용하여 어떤 객체가 메모리를 점유하고 있는지 확인하세요.

Step 2: 메모리 누수(Memory Leak) 체크

사용이 끝난 객체가 참조 해제되지 않고 계속 쌓이고 있는지 확인해야 합니다.

  • Static 변수에 무거운 객체를 담아두지 않았나요?
  • ThreadLocal을 사용한 뒤 remove()를 호출하지 않았나요?
  • **자원(Stream, DB Connection)**을 닫지 않고 방치하지 않았나요?

Step 3: JVM 옵션 조정

임시방편일 수 있지만, 애플리케이션의 규모에 맞게 메모리 설정을 변경합니다.

Bash
 
# 최대 힙 크기를 2GB로 설정
java -Xmx2g -Xms2g -jar my-app.jar

💡 시니어의 조언: '더 큰 서버'가 정답은 아닙니다

메모리가 부족하다고 무작정 서버의 RAM을 증설하는 것은 밑 빠진 독에 물 붓기일 수 있습니다. 근본적인 코드의 효율성을 먼저 점검하세요. 제너레이터(Python의 경우)나 스트림 API를 활용해 대량 데이터를 한꺼번에 로드하지 않는 습관이 중요합니다.

특히, 커스텀 예외를 공부할 때 언급했듯이 예외 상황을 미리 예측하고 방어적인 코드를 짜는 것이 OOME를 예방하는 최고의 방법입니다.

반응형