OOME-Out Of Memory Error(2. 케이스)

0

JAVA

목록 보기
17/18
post-thumbnail

이번 포스팅에서는 OOME가 발생하는 몇 가지 케이스에 대해서 작성해보려고 합니다.

OOME 케이스

  1. java.lang.OutOfMemoryError: Java Heap Space
  2. java.lang.OutOfMemoryError: GC Overhead Limit Exceeded
  3. java.lang.OutOfMemoryError: Metaspace
  4. java.lang.OutOfMemoryError: Requested array size exceeds VM limit

java.lang.OutOfMemoryError: Java Heap Space

해당 에러는 저 역시 개발하면서 종종 보았던 메시지입니다. 아마 많은 분들이 이 에러를 경험해보시지 않으셨을까 생각됩니다.
이 에러는 단순히 생성하고자 하는 오브젝트가 JVM의 Heap 메모리 가용 영역을 넘어설 경우 발생합니다.

원인 및 특징

  • 이 에러 메시지는 오브젝트를 java heap에 할당할 수 없을 때 발생
  • 꼭 memory leak을 의미하지는 않음
  • 애플리케이션을 위한 충분한 heap 공간이 없을 때 발생
  • 다른 경우로는 애플리케이션의 생존 주기가 지나치게 길 경우 객체 참조를 의도적이지 않게 오래 참조하거나 이로 인해 GC 대상에서 제외되게 되어 발생할 수 있음, 외부 API를 사용할 경우 의도치 않게 객체 참조를 오래하여 발생할 수 도 있음
  • 또 다른 원인으론 지나친 finalizer 사용으로 인해 발생할 수 있음
  • 만약 클래스가 finalize 메소드를 가지고 있다면 해당 타입의 객체는 자신들의 공간에 대한 GC를 포함시킬 수 없음
  • finalizer가 finalizer queue를 처리하는 속도보다 빠를 경우 힙 공간이 가득차서 발생 가능

java.lang.OutOfMemoryError: GC Overhead Limit Exceeded

원인 및 특징

  • 이 에러는 GC 빈도가 빈번하고 Java 프로그램 실행이 느려지게 만들 수 있습니다.
  • GC 이후 만약에 Java 프로세스가 GC 작업 하는 동안 전체 동작시간의 98%를 소비했음에도 heap 영역이 2% 이하로 확보되었을 때 발생
  • 라이브 데이터가 할당 받아야 할 heap 영역의 크기가 적을 때 발생 가능. 즉, 위 heapspace가 부족한 것과 관련이 있음

java.lang.OutOfMemoryError: Metaspace

원인 및 특징

  • Metaspace는 로드된 Class들의 메타데이터가 저장되는 공간
  • 클래스 메타데이터에 의해 사용되어질 Metaspace의 크기는 MaxMetaspaceSize 명령어로 설정 가능
  • Class 메타데이터들 위해 필요한 native memory(Metaspace)의 크기가 MaxMetaSpaceSize를 초과했을 때 에러 발생
  • Heap 크기 조정을 통해 조치 가능

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

원인 및 특징

  • 애플리케이션이 배열의 할당을 heap size보다 크게 했을 때 발생
  • 예를들어 512mb 크기의 배열 할당을 시도한다고 했을 때, 최대 heap size가 256mb이면 에러 발생

참고

profile
컴퓨터공학과 + 실무 = 4 + N = 모르는거 ∞ ...

0개의 댓글