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
파일을 열고 맨 위에 이 코드를 넣으면 끝!
참고 문헌
- Java -Xmx Memory Settings
- -Xmx를 아무리 늘려도 Out Of Memory가 발생해요.. 그렇다면 MaxPermSize를~
- [Tomcat] out of memory 발생시 처리 방법 Linux