java에서 OOM이 발생했지만 어떻게 처리해야할 지 모르는 경우 길잡이가 되어주기 위한 글 입니다.
OOM(OOME)은 OutOfMemoryError의 줄임말입니다. 프로그램이 요청하는 메모리가 할당된 메모리를 넘게 되는 경우 발생하는 에러입니다.
순간적으로 너무 큰 데이터를 한 번에 처리하려는 경우 할당된 메모리를 넘어서는 경우가 있습니다.
String 타입의 데이터를 잘 못 사용하는 경우에도 발생할 수 있습니다.
일반적으로 메모리가 할당되고 메모리가 따로 해제되지 않는 경우 program을 장기간 사용할 시 메메모리 누수(memory leak)이 발생할 수 있습니다. java는 GarbageCollector가 memory 관리를 담당합니다.
이번에 다룰 경우는 같은 데이터를 여러 스레드에서 다루는 경우에 실제 데이터가 크지 않더라도 할당된 메모리를 넘게 되는 경우입니다.
메모리 누수가 발생하는 문제는 로직 에러와는 달라서 찾기가 매우 난감한 경우가 많습니다. 관련 문제를 해결하기 위한 대표적인 무료 tool을 소개하려고 합니다.
다운로드 링크 : https://projects.eclipse.org/projects/tools.mat
OOM이 났을 때 힙덤프를 남기게 한 경우 hprof파일이 남습니다.
MAT는 hprof 파일을 분석할 수 있습니다. 어디서 memory를 많이 들고 있는지, 어떤 클래스가 이를 호출했는지 등 실제 memory leak이 어디서 발생했을지에 대한 단서를 제공합니다.
MAT은 Eclipse의 플러그인입니다. 우선 Eclipse를 다운 받고, Eclipse Marketplace에서 MAT을 다운받아 주세요.
MAT을 다운 받으셨다면 Eclipse 상단의 메뉴를 통해 hprof 파일을 열어주세요.
File > Open Heap Dump > *.hprof
경우에 따라 Eclipse에서 메모리가 부족해서 버벅거리는 상황을 맞을 수도 있습니다.
만약 너무 버벅거리는게 심하다면 eclipse.ini 파일에서 eclipse의 최소 힙, 최대 힙 크기를 hprof 파일 크기에 따라 키워주세요.
파일 위치는 window 검색 > eclipse 입력 > 파일 위치 열기
를 통해 찾을 수 있습니다.
hprof 파일을 open 하면 다음과 같은 Overview가 생성될 것입니다.