
Tomcat Web Application very likely to create a memory leak
따봉도관절
·2022. 11. 11. 00:58
개발 도중 Spring Application War 파일을 지속적으로 재배포하는 경우가 빈번하게 발생하였는데, 어느 순간부터 War 파일 재배포 시 해당 오류가 발생하고 애플리케이션이 정상적으로 작동하지 않는 등 당황스러운 상황을 맞았다.
원인: 대체로 웹 애플리케이션을 너무 많이 Update 하거나 Reload 한 것이 원인이다. Tomcat과 JVM은 웹 애플리케이션을 삭제하고 다시 생성할 때 할당한 모든 메모리를 해제하지는 않는다. 따라서 웹 애플리케이션을 여러 번 Reload 하면 할당된 메모리가 바닥나서 동작하지 않게 된다.
해결 : 당장 해결 방안은 톰캣을 재시작하는 것이며, 앞으로도 웹 애플리케이션을 빈번하게 Reload 해야 할 상황이라면 톰캣이 할당할 수 있는 메모리를 늘려준다.
[STEP 1] Tomcat Catalina.sh 파일 수정
$ cd /usr/local/tomcat/bin
$ vi catalina.sh
[STEP 2] 파일 상단에 아래 코드 추가 후 저장
JAVA_OPTS="-Djava.awt.headless=true -server -Xms128m -Xmx128m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:+DisableExplicitGC"
# 저장 하고 나가기 -> esc키 누르고 :wq! 입력 후 엔터
# 저장 안하고 나가기 -> esc키 누르고 :qa! 입력 후 엔터
- -Xms : 자바 힙의 최초 크기
- -Xmx : 자바 힙의 최대 크기
- -XX:NewSize : 객체가 생성되어 저장되는 초기 사이즈
- -XX:MaxNewSize : 최대 New 사이즈
- -XX:PermSize : 초기 Perm 사이즈
- -XX:MaxPermSize : Perm 최대 사이즈
[STEP 3] 톰캣 재시작
$ cd /usr/local/tomcat/bin
$ ./shutdown.sh
$ ./startup.sh
JVM 최대 힙 크기 기본값은 64MB이다. JVM에서는 최초 크기와 최대 크기를 같게 부여하도록 권장한다.
힙 영역이기 때문에 동적으로 변하는 메모리의 오버헤드를 줄이기 위해서라고 한다.
웹 애플리케이션 재 배포 시 항상 기존에 작동 중이던 애플리케이션을 먼저 삭제해서 Shutdown 한 뒤에 올릴 수 있도록 해야 한다. DB 접근 중인 상태에서 재배포가 이루어지면 메모리 누수의 원인이 될 수 있다. 컴퓨터 강제 재부팅 같은 느낌.
'Tomcat' 카테고리의 다른 글
Tomcat CORS Filter 설정하기 (0) | 2023.01.15 |
---|