Java

[Java] out of memory error 즉 OOME 에 대하여

Razelo 2020. 12. 12. 16:52

stack 예외처리를 알아보던 중에 out of memory를 공부하게 되었는데 아주 잘 정리된 블로그를 발견했다. 

 

JVM까지 연결시켜서 설명해주는데 정말 내용이 좋다. 

 

참고로 자료구조와 함께 배우는 알고리즘 입문(자바편)의 136페이지의 코드에서 OOME에 대해 나온다.

 

그 책도 읽어볼 만 하다. 

 

간략하게 살펴보고 가겠다. 


OOME의 경우 특히나 대응을 하기가 쉽지 않다고 한다. 

주로 개발이 대부분 완료되고 난 후에 사용자 테스트 쯤에 많이 발생하는 에러라고 한다. 

 

그리고 주로 JVM Option 혹은 Dump 파일 분석을 통해 대응하게 된다고 한다. 

 

JVM Option 

Java의 장점은 JVM이 있는 곳이면 어디서든 동작하는 것인데 반면 디바이스 별로 동일한 성능은 보장되지 않는다고 한다. 그래서 OS/하드웨어 별로 JVM 설정을 변경하는데 이것이 JVM Option이라고 한다.

 

JVM 표준인 Standard 옵션과 Non-Standard 옵션이 있다고 한다. 

 

Standard Option: JVM 표준 옵션으로 벤더에 상관없이 동일하다고 한다. 주로 환경세팅.

Non-Standard Option: JVM 표준이 아니라서 추가 혹은 없어지기도 하는 옵션인데 성능에 직접 영향을 주는 옵션이다. 

 

Dump 파일 분석

Dump 파일 분석의 경우 애플리케이션 운영 중에 문제가 발생하면 어플리케이션의 상태를 스냅샷 형태로 파일로 저장한 것이 Dump 파일이라고 한다. 그래서 이걸 분석해서 문제를 찾는 것이다. 분석 툴도 다양하다고 한다. 

 

OOME 는 다양하게 발생하는데 주로 아래와 같다고 한다. 

 

1. Exception in thread "main":java.lang.OutOfMemoryError: Java heap spac

Heap size가 부족해서 java object 를 Heap에 할당하지 못하는 경우에 발생한다고 한다. JVM 옵션 설정을 하지 않으면 주로 발생한다고 한다. 

 

2. Exception in thread "main": java.lang.OutOfMemoryError: PermGen space

class나 Method객체를 PermGen space에 할당하지 못하면 발생하고 너무 많은 class 를 로드할때 발생한다고 한다. 설계나 구현을 잘못하면 발생한다고 한다. 

 

3. Exception in thread "main": java.lang.OutOfMemoryError: Reqeusted array size exceeds VM limit

사용할 배열 사이즈가 VM에서 정의된 사이즈를 초과하면 발생한다고 한다. 

 

4. Exception in thread "main": java.lang.OutOfMemoryError: request bytes for .Out of swap space?

Java는 런타임에 물리적 메모리를 초과하면 가상 메모리를 확장해서 사용하는데 가용한 가상메모리가 없으면 발생한다고 한다. 

 

5. Exception in thread "main": java.lang.OutOfMemoryError: (Native method)

JVM에서 설정된 것보다 큰 native 메모리가 호출될 때 발생한다고 한다. 


JVM의 전반적인 구조는 아래와 같다.

 

그리고 JVM Option을 통해 각 영역별로 메모리 할당이 가능하고 덕분에 OOME가 발생하면 영역별로 메모리 옵션을 늘려서 대응한다고 한다. 

 

 

 

참고로 시스템의 리소스는 한정되어있어서 JVM의 특정 영역을 늘리면 다른 영역은 줄어들어서 다른 문제가 생길 수 있다고 한다. 그러니 Dump파일 분석을 제대로 하고 나서 원인을 수정하라고 한다. 

 

Java의 Reflection을 사용하거나 Spring 과 같은 프레임워크를 사용할 경우 메모리에 대한 고려를 해서 설계를 해야한다고 한다. 


아래 블로그에서 많은 도움을 받았다. 

 

감사합니다. 

 

www.nextree.co.kr/p3878/

 

Java 프로그래밍: Out Of Memory 오류

Java로 소프트웨어를 개발하는 사람이라면 누구나 한번쯤 Out Of Memory Error(이하 OOME)를 만나 보았을 것이다. OOME의 경우 Java의 다른 Error와 다르게 원인과 대응을 하기가 쉽지는 않다. 경험에 비추어

www.nextree.co.kr

 

반응형