tomcat의 out of memory 오류를 막기

Eclipse에서 Spring Framework 기반의 웹 서비스를 개발한다. Tomcat 서버를 띄워놓은 채 소스코드를 수정하면 자동으로 다시 빌드해서 Tomcat 서버에 반영해주는 기능이 있어 편하다. 그런데 이렇게 소스코드를 수시로 고치다 보면 한번은 out of memory error가 발생한다. 이러면 Tomcat 서버를 내렸다 다시 올려야 하는데 귀찮다. 그래서 다시 구글링!

기본적으론 메모리를 늘려서 해결하면 되겠지만 여러 자료를 살펴보니 한 가지 주의할 점이 있다. Java 힙 메모리만 늘려선 똑같은 오류가 계속 나올 가능성이 있다. 객체의 메타 정보(Reflection에 쓰는)는 일반적인 Java 힙이 아닌 특수한 힙에 들어간다. Spring Framework 등과 같이 메타 정보를 적극적으로 활용하는 프레임워크 때문에 이 특수 힙의 공간이 부족해지곤 한다. 이런 경우에는 아무리 일반 힙의 크기를 늘려봤자 소용 없다. 어느 쪽이 문제인지 잘 모르고 개발 머신의 사양이 낮은 것도 아니라 굳이 찾아볼 생각도 안 하고 이 두 힙의 크기를 모두 늘리기로 했다. 이때 사용한 코드는 다음과 같다.

export CATALINA_OPTS="$CATALINA_OPTS -Xms64m -Xmx512m -XX:MaxPermSize=512m"

각 옵션은

  • -Xms는 Java 힙의 최소 크기
  • -Xmx는 Java 힙의 최대 크기
  • -XX:MaxPermSize는 메타데이터용 힙의 크기

를 뜻한다.

이제 export ~~~ 코드를 어디에 넣을 것인가? ~/.profile 같은 개인용 쉘 구성파일에 넣어도 되겠지만 팀 전체에 한꺼번에 전파시키기 위해 소스 서버에 있는 tomcat 의 소스 코드를 직접 고쳤다. /usr/local/tomcat/bin/catalina.sh 파일을 열고 맨 위에 이 코드를 넣으면 끝!

참고 문헌

Advertisements

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu