OOME(Out of Memory Error)

오형상·2025년 6월 10일

java

목록 보기
10/10
post-thumbnail

1. OutOfMemoryError란?

OutOfMemoryError는 JVM이 메모리 공간을 더 이상 확보할 수 없을 때 발생하는 오류입니다.
JVM은 Heap, Stack, Metaspace 등 여러 영역으로 메모리를 나누어 관리하며, 이 중 하나라도 고갈되면 OutOfMemoryError가 발생할 수 있습니다.

2. 주요 발생 원인과 유형

JVM의 메모리 영역에 따라 OOM은 여러 유형으로 나뉘며, 각각의 원인과 대응 방식이 다릅니다.

2.1 Java Heap Space

  • 설명: 객체를 저장하는 Heap 공간이 부족할 때 발생

  • 원인 예시:

    • 대규모 데이터를 한 번에 처리하거나,
    • 컬렉션(List, Map 등)에 데이터를 무한히 쌓는 등 잘못된 메모리 사용으로 인해
      결국 메모리가 부족해져 java.lang.OutOfMemoryError: Java heap space 오류가 발생합니다.
  • 해결 방법:

    • 필요 없는 객체 참조 제거
    • 메모리 프로파일링 도구(VisualVM, MAT 등)를 통한 누수 확인
    • JVM 옵션에서 Heap 크기 조정: -Xmx, -Xms

2.2 GC Overhead Limit Exceeded

  • 설명: GC가 너무 자주 실행되며, 메모리를 거의 회수하지 못할 때 발생

  • 원인 예시:

    • 객체가 지속적으로 생성되어 Heap이 가득 차고,
    • GC가 반복 실행되지만 메모리를 회수하지 못하는 상황에서
      java.lang.OutOfMemoryError: GC overhead limit exceeded가 발생합니다.
  • 해결 방법:

    • 메모리 사용 패턴 점검 및 튜닝
    • -XX:-UseGCOverheadLimit로 임시 우회 가능 (근본 해결 아님)

2.3 Metaspace (Java 8 이후)

  • 설명: 클래스 메타정보를 저장하는 Metaspace가 가득 찼을 때 발생

  • 원인 예시:

    • 애플리케이션에서 리플렉션이나 동적 프록시 등을 반복적으로 사용하여 클래스가 계속 로딩되거나,
    • 클래스 로더가 메모리를 해제하지 않아 누수가 발생할 경우
      java.lang.OutOfMemoryError: Metaspace가 발생할 수 있습니다.
  • 해결 방법:

    • 불필요한 클래스 로딩 최소화
    • -XX:MaxMetaspaceSize 옵션 조정

2.4 Direct Buffer Memory

  • 설명: ByteBuffer.allocateDirect() 사용 시 Native Memory 부족

  • 원인 예시:

    • 직접 할당한 버퍼를 해제하지 않거나,
    • -XX:MaxDirectMemorySize보다 큰 버퍼를 반복적으로 생성하는 경우
      java.lang.OutOfMemoryError: Direct buffer memory가 발생합니다.
  • 해결 방법:

    • 직접 버퍼 사용 줄이기
    • -XX:MaxDirectMemorySize 설정 확인

2.5 Unable to create new native thread

  • 설명: 스레드 생성 시 Native Memory 부족

  • 원인 예시:

    • 스레드를 과도하게 생성하거나,
    • 운영체제 차원의 스레드 수 제한(예: ulimit)에 도달하면
      java.lang.OutOfMemoryError: unable to create new native thread 오류가 발생합니다.
  • 해결 방법:

    • 스레드 풀 사용으로 스레드 개수 제한
    • OS 스레드 수 제한 확인 및 조정 (ulimit -u)

Reference

0개의 댓글