java.lang.OutOfMemoryError 문제 해결

By | 2013/06/03

324 오류(net::ERR_EMPTY_RESPONSE): 서버가 데이터를 전송하지 않고 연결을 종료했습니다

잘 동작하던 Tomcat 서버가 갑자기 말썽을 일으켰다. 분명 새벽까지 잘 동작하는 것을 확인하고, 다음날 아침에 접속해보니 페이지 로딩이 안되다가... 위의 에러 메시지를 보이며 종료... 문제 해결을 위해 Tomcat, mysql, apache 등을 껏다 켰다를 반복하며 원인을 찾던 중, Tomcat을 껏다켰을 때 정적페이지를 로딩하면 아무 문제 없이 동작하다는 것을 확인할 수 있었다. 뭔가 동적페이지에 연결을 시도하는 순간 서버가 뻗었다. 도대체 뭐가 문제인지... 크롬에서만 테스트 하다가 파이어폭스에서 테스트를 해보니 이번에는 java.lang.OutOfMemoryError가 발생했다. 이건 또 뭔가!

구글링을 하다보니 java.lang.OutOfMemoryError는 메모리 영역을 더 크게 설정을 해줘야 된다고 나와있다. 관련 문제 해결방법에 대한 페이지는 무수히 많이 나와있는데, Tomcat 을 실행할 때 옵션을 이렇게 저렇게 넣으라는 둥... 내 상황에서 적용하기 쉽게 설명해놓은 곳을 찾기 어려웠다. 여러 페이지들을 참고하면서 조합해서 결국 문제 해결!

톰캣 설정 파일인 catalina.sh 파일을 수정해야한다. 서버는 우분투 12.04를 사용중이었고, /usr/share/tomcat6/bin/catalina.sh 를 열어서 파일의 맨 위에 다음 한 줄을 추가하였다.

JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

그리고 나서 Tomcat을 재실행하니 거짓말 처럼 잘 동작한다.

추가적으로메모리 누수 방지를 위해서 /var/lib/tomcat6/conf/web.xml 파일에서 servlet 설정 사이에 다음을 추가하였다. 일단 문제는 해결한 상태에서 추가적으로 설정한 부분이라 이 설정이 유효한지는 잘 모르겠다.

<init-param>
    <param-name>enablePooling</param-name>
    <param-value>false</param-value>
</init-param>