OOM 난 JVM을 자동으로 종료시키기
java.lang.OutOfMemoryError가 터져도 JVM 프로세스 자체는 살아 있는 경우가 있습니다. 스레드 하나가 OOM으로 죽어도 나머지는 돌아가니, 포트는 열려 있는데 요청은 제대로 처리하지 못하는 어정쩡한 상태가 됩니다. 이럴 때 헬스체크는 통과하고 실제 응답만 실패해서 장애 감지가 늦어집니다.
-XX:+ExitOnOutOfMemoryError를 붙이면 첫 OOM 발생 시점에 JVM이 바로 종료됩니다. 공식 설명도 "the JVM exits on the first occurrence of an out-of-memory error"로, 메모리 오류를 애플리케이션에서 붙잡기보다 인스턴스를 재시작하고 싶을 때 쓰라고 안내합니다. 기본값은 비활성이라 명시적으로 켜야 합니다. systemd의 Restart=on-failure나 컨테이너 재시작 정책과 묶으면 OOM 난 프로세스가 깔끔하게 죽고 새로 뜹니다.
# setenv.sh (Tomcat)
CATALINA_OPTS="$CATALINA_OPTS -XX:+ExitOnOutOfMemoryError"
CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat"원인 분석용 힙 덤프가 필요하면 -XX:+HeapDumpOnOutOfMemoryError를 같이 켜 두면 덤프를 남기고 종료합니다. 비슷한 이름의 -XX:+CrashOnOutOfMemoryError는 종료가 아니라 JVM을 크래시시키고 텍스트/바이너리 크래시 파일을 만드는 옵션이라, 그냥 재시작만 원한다면 ExitOnOutOfMemoryError 쪽을 쓰면 됩니다.
🔗 https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html
로그인 후 답글을 남길 수 있습니다.