또자의 코딩교실

OOME(Out of Memory Error)란? + 대중적인 해결법 본문

코딩공부/java

OOME(Out of Memory Error)란? + 대중적인 해결법

또자자 2022. 3. 25. 20:18
OOME는 Out Of Memory Error(Exception) = JVM의 메모리가 부족하여 발생한 에러

 

OOME(Out of memory error)는 물류메모리 기준으로 Heap Meomory(GC)를 설정하게 된다. 

GC의 구성은 크게 Y와 Old로 나뉘는데 Y에서 처리된것들은 Old에 차곡차곡 적재되다 한계점(full GC)이 오면 heap Dump가 떨어지게 된다. 

 

1. Java.lang.OutOfMemoryError: Java heap space (Heap Dump 하락)

Java의 Heap Memory 공간이 부족하여 발생합니다. 공간 부족의 원인으로는 Heap Memory의 크기가 작아서 발생하는 경우와 애플리케이션 로직의 문제로 발생하는 경우가 있습니다.

해당 오류를 해결하기 위한 가장 쉬운 방법으로는 -Xmx 옵션을 사용하여 Heap Memory의 크기를 증가시키는 방법이 있습니다. 하지만 이는 GC Time의 증가를 동반하기 때문에 VMWare등 가상머신을 활용한 사전 테스트가 필요합니다.

OOME가 발생한 시점에 생성된 Heap Dump 분석을 기반으로 쓸데없이 많은 Memory를 사용하거나 Memory Leak을 유발하는 로직을 찾아내어 수정해야 합니다.

 

DB pool 재설정(db connection을 재설정)하는 방식으로 해결할 수 있는데, 타 회사의 AP일 경우, 자체 DB pool을 사용하고 있을 가능성도 있다. 따라서 자체 db pool을 사용하면 connection이 불가하기 때문에 jeus에 도킹하는 우리쪽의 db pool을 사용하여 오류를 줄이고자 하는 것을 권고하여 장애를 해결한 사례가 있다.

 

2. Java.lang.OutOfMemoryError : PermGen space

Java Heap Memory 영역 중 Perm 영역은 String pool, Class Method와 관련된 각종 Meta Data 등을 저장하는 용도로 사용되는 공간이었지만 Java8부터 삭제되었습니다.

JVM 기동시 로딩되는 Class 또는 String의 수가 많다면 Java.lang.OutOfMemoryError : PermGen space의 원인이 됩니다. 또한 Classloader Leak에 의해 OOME가 발생될 수 있습니다.

 

Permanent 영역은 Heap 영역과는 달리 일반 비즈니스 프로그램으로 핸들링 할 수 없기때문에 JVM Option 튜닝으로도 해결이 되지 않는다면 WAS 혹은 JDK 버그를 의심해봐야 합니다.

 

PermGen 영역은 Class를 로딩하고 해제하지 않으면 누수가 일어나며 PermGen 영역에 OutOfMemory가 발생할 수 있습니다. Class Loading 현황을 분석하려면 컨텍스트 메뉴에서 Java Basics > Class Loader Explorer를 선택해서 확인 할 수 있습니다.



출처: https://12bme.tistory.com/431?category=682904 [길은 가면, 뒤에 있다.]

 

 

Comments