오류가 뜻하는 것
OutOfMemoryError는 Java heap 부족뿐 아니라 Metaspace·direct buffer 같은 메모리 자원이나 native allocation 실패에서도 발생할 수 있으므로, detail message를 실제로 고갈된 자원과 연결해 확인해야 합니다.
detail message가 먼저인 이유
Java heap space, GC overhead limit exceeded, Metaspace, Compressed class space, Direct buffer memory, unable to create native thread는 같은 조치로 해결하는 오류가 아닙니다. 예외의 detail message와 JVM·OS 상태를 함께 봐야 어느 allocation 또는 resource가 실패했는지 구분할 수 있습니다.
모두 memory leak은 아닙니다
Java heap space도 heap 상한이 workload에 비해 작은 경우, 한 번에 지나치게 큰 객체를 만든 경우, 객체 참조가 계속 남는 경우에 모두 나타날 수 있습니다. GC 뒤 live set이 안정적으로 증가하는지 확인하기 전에는 leak으로 단정하지 않습니다.
처음 내릴 결정
heap 문제라면 GC log·class histogram·heap dump를, JVM 내부 native memory라면 Native Memory Tracking과 OS 지표를, thread 생성 실패라면 thread 수·stack 크기·process 제한을 우선 확인합니다. thread는 memory 영역이 아니라 생성에 native resource가 필요한 실행 단위라는 점을 구분합니다.
공식 문서와 적용 범위
- Oracle Java 26: Troubleshoot Memory Leaks (새 창에서 열림)
- Oracle Java 26: OutOfMemoryError API (새 창에서 열림)
현재 JDK/JVM version, 실행 옵션, collector, container 제한과 실제 memory 사용 패턴에서 다시 확인합니다.