OutOfMemoryError는 JVM이 메모리 공간을 더 이상 확보할 수 없을 때 발생하는 오류입니다.
JVM은 Heap, Stack, Metaspace 등 여러 영역으로 메모리를 나누어 관리하며, 이 중 하나라도 고갈되면 OutOfMemoryError가 발생할 수 있습니다.
JVM의 메모리 영역에 따라 OOM은 여러 유형으로 나뉘며, 각각의 원인과 대응 방식이 다릅니다.
설명: 객체를 저장하는 Heap 공간이 부족할 때 발생
원인 예시:
java.lang.OutOfMemoryError: Java heap space 오류가 발생합니다.해결 방법:
-Xmx, -Xms설명: GC가 너무 자주 실행되며, 메모리를 거의 회수하지 못할 때 발생
원인 예시:
java.lang.OutOfMemoryError: GC overhead limit exceeded가 발생합니다.해결 방법:
-XX:-UseGCOverheadLimit로 임시 우회 가능 (근본 해결 아님)설명: 클래스 메타정보를 저장하는 Metaspace가 가득 찼을 때 발생
원인 예시:
java.lang.OutOfMemoryError: Metaspace가 발생할 수 있습니다.해결 방법:
-XX:MaxMetaspaceSize 옵션 조정설명: ByteBuffer.allocateDirect() 사용 시 Native Memory 부족
원인 예시:
-XX:MaxDirectMemorySize보다 큰 버퍼를 반복적으로 생성하는 경우java.lang.OutOfMemoryError: Direct buffer memory가 발생합니다.해결 방법:
-XX:MaxDirectMemorySize 설정 확인설명: 스레드 생성 시 Native Memory 부족
원인 예시:
java.lang.OutOfMemoryError: unable to create new native thread 오류가 발생합니다.해결 방법:
ulimit -u)Reference