관리 메뉴

피터의 개발이야기

[JAVA] Tomcat OutOfMemory시 톰캣 자동 재시작 본문

Programming/JAVA

[JAVA] Tomcat OutOfMemory시 톰캣 자동 재시작

기록하는 백앤드개발자 2020. 12. 17. 08:00
반응형

서비스 운영 중에 톰켓이 OutOfMemory를 뱉어내며 작동을 하지 않을 때가 있다.

 

APM 시스템이 잘 갖춰진 곳이라면,

시스템의 문제가 발생 시에 바로 알림이 운영자에게 보내져서 바로 대응이 가능하겠지만,

그렇지 않은 경우 문제가 커진 후에나 장애처리가 될 것이다.

 

예기치 못한 상황에서 자동적으로 시스템을 복구하는 방법이 있다.

JVM옵션에서 이것을 제공하고 있다.

OnOutOfMemoryError 옵션을 이용하면, OutOfMemroy 발생 이후에 특정 동작을 지정할 수 있다.

 

톰캣 옵션 추가 방법

setenv.sh에 "-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError" 옵션 추가

JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx1024m \
    -XX:MaxPermSize=128m \ 
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:OnOutOfMemoryError=/home/ec2-user/tomcat/bin/tomcatRestart.sh"

 

 

OOME 시 톰캣 재기동 tomcatRestart.sh

#!/bin/sh
kill -9 $(ps aux |awk '/tomcat/ {print $2}')
sleep 2
/home/ubuntu/tomcat/bin/startup.sh

 

톰켓 강제 중지

CATALINA_OPTS="-Djava.awt.headless=true -server \ 
	-Xms256m -Xmx1024m \
    -XX:MaxPermSize=128m \
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:OnOutOfMemoryError=kill -9 %p"

 

Heap Dump on OutOfMemoryError

OutOfMemoryError로 인한 JVM에 종료시 Heap Dump를 생성해준다.

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

-XX:HeapDumpPath를 생략하면 JVM 시작 디렉토리에 java_pid<pid>.hprof형태로 생성된다.

-XX:+PrintClassHistogramAfterFullGC, -XX:+PrintClassHistogramBeforeFullGC 등의 옵션으로 Full GC 전/후의 메모리 상태를 간략히 덤프할 수 있다.

반응형
Comments