반응형
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를 예방하는 최고의 방법입니다.
반응형
'개발 > Trouble Shooting' 카테고리의 다른 글
| 자바의 영원한 숙제: NullPointerException (NPE) 완벽 가이드 (0) | 2025.12.29 |
|---|---|
| 클래스가 어디로 사라졌을까? ClassNotFoundException 완벽 가이드 (0) | 2025.12.29 |
| 데이터베이스와의 소통 불능: SQLException 완벽 가이드 (0) | 2025.12.29 |
| 데이터 통신의 첫 번째 관문: IOException 완벽 이해하기 (0) | 2025.12.29 |
| 재귀의 늪에 빠지다: StackOverflowError 원인과 해결 방법 (0) | 2025.12.29 |