본문 바로가기
language/java

Out Of Memory

by vamalboro 2009. 6. 12.
이클립스로 웹프로젝트 개발을 하다보면 사용하는 클래스의 양이 늘어남에 따라 간간히 PermGen Space라는 메세지와 함께 Out Of Memory Error가 뜨면서 서버가 다운되는 경우가 있다.

그동안은 그냥 서버를 재시작하면서 개발을 해왔지만 이번프로젝트에서는 위 상황이 상당히 많이 발생하여서

검색해보니 PermGen이란 Permanent generation이라는 JVM의 메모리영역이며 이 메모리영역에 클래스의 정보가 로드되어진다고 나와있다.

대략 계산해보니 이번프로젝트에 쓰이는 클래스파일이 대략 3500개정도 되는데 아마도 자주 발생한 이유가
Permanent 영역을 기본으로 잡아주어서 그런것같다.

그러다 검수를 앞두고 이번엔 java heap space 메세지의 Out Of Memory Error가 발생..

보안테스트 도중 발생하였는데 테스트를 직접 고객사 담당자가 해서 통보받았으니 정말 진땀이 나던 상황이었다.

일단 이 문제를 해결하기 위해 검색을 하던도중. 지금까지 내가 발로 개발을 했구나 라는 생각이 스물스물...

그냥 저냥 돌아가기만 하면 되지. 라는 생각으로 만들었던 생각이 들며 나 자신에게 참 부끄러운 하루였다.

또한 자바에 대한 조금의 지식을 더 얻고 이해하는 시간이기도..

일단 서론은 여기에서 접고.

난 문제점이 Memory Error이기때문에 프로그램의 실행중 JVM영역의 메모리상태를 프로파일링하고자 이리저리 검색하던도중 블로그를 운영하시는 어떤 개발자분의 http://www.tuning-java.com/248  게시물에서 좋은 정보를 얻었다.

jdk\bin\jvisualvm.exe 라는 파일인데 실행중인 모든 JVM을 모니터링 하는 프로그램이다.

이번개발은 JDK6 버젼으로 하고있어서 기본으로 들어있다.

일단 이 프로그램(Java VisualVM)을 실행시킨후 톰캣을 실행.

Java VisualVM 에서 톰캣이 실행이되면 알아서 톰캣을 실행하는 JVM을 catch~

catch된 JVM을 오른쪽버튼 OPEN한다.

아래 그림과 같이 나온다.


위는 현재 내가 검사하고 있는 화면이라 초기화면이랑은 조금 틀리지만 현재 실행중인 톰캣의 JVM의 상태를 확인할 수 있다.

OverView는 여러가지 환경정보들이 있다. JVM arguments, System properties등등..

다음으로 Monitor탭을 보자.



현재 JVM 의 Heap영역의 상태를 보여주고 있다.

위 그림을 보면 현재 약 3시간이 넘게 톰캣을 실행중이며 시간대별로 Heap영역의 메모리점유율 상태를

그래프와 수치로 보여준다. 또한 우상단에 Heap Dump버튼을 클릭하면 클릭하는 시점의 Heap영역의 메모리점유율 덤프가 생성된다.(객체의 instance갯수, 현재 차지하고 있는 메모리용량(%, 수치) 를 볼 수 있다.

덤프된 화면은 아래와같다.


이것을 보고 문제점이 무엇인지 대략 유추할 수 있었고.

몇시간의 테스트끝에 99% 확실한 문제점을 찾아낼 수 있었다.

개발을 하면서 간과했던점이 웹어플리케이션 전체에서 코드값을 사용하는데 이값을 어플리케이션 속성에 담아놓고 쓰지 않고 세션에 담아서 쓰고 있었다.

세션은 웹페이지를 요청하는 사용자 한명당(요청수가아니다.) 한개식 생성이되며 현재 session timeout 시간은 7일이다.......-_-

스트레스툴로 여러번의 XSS공격과 SQL Injection공격등등을 하며 테스트를 하는걸 상상해보면 계속해서 쌓여가는 세션때문에 결국엔 메모리의 한계가와 Out Of Memory를 토해내는 것이었더랬지..

뭐 톰캣의 JVM Heap메모리 설정을 기본으로 잡고 했던것도 문제점이긴하다.

일단 해결법은 JVM 메모리영역을 늘려주고 Session TimeOut시간을 30분에서 1시간정도를 잡아주면 될것같다.

다음부턴 절대 세션에 코드값을 담는 일은 하지 않도록 다짐하면서..



2009년 6월 더운 초여름날 두달째 야근을 하며 폐인의 모습으로







아참!오픈소스 스트레스툴로 Jmeter라는것도 있다. (좋드만 ㅋ)