본문 바로가기
성능과 튜닝/성능 및 부하 테스트

Apache Tomcat 메모리 누수 재현

by 안드레날린 2026. 7. 7.

들어가며

다양한 이유로 메모리 누수 테스트를 진행해 봐야 하는 경우가 종종 발생한다.

가령 예를 들면 아래와 같은 경우이다.

  • 실제 JVM 옵션이 정상적으로 반영이 되었는지 실측 관점에서 확인
  • 다른 애플리케이션이 같이 동작하는 경우 영향도 파악
  • 모니터링 알람등 제대로 동작하는지 검증

 

위 경우 외에도 많은 경우가 있을것이다.

 

테스트 코드

JSP 테스트 페이지 #1 - OOM이 발생할때 까지 무한정 메모리를 할당

말그대로 OOM이 발생할때 까지 무한정 메모리를 할당한다.

  • 호출 방법 : http://localhost:8080/oom.jsp
# oom.jsp

<%@ page import="java.util.*" %>

<%
    List<byte[]> memoryLeak = new ArrayList<>();

    while (System.currentTimeMillis() > 0) {
        memoryLeak.add(new byte[10 * 1024 * 1024]); // 10MB

        out.println("Allocated: " + (memoryLeak.size() * 10) + " MB<br>");
        out.flush();

        Thread.sleep(100);
    }
%>

 

JSP 테스트 페이지 #2 - 메모리 할당량을 조정

사용자가 지정한 만큼만 메모리를 할당

  • 호출 방법 : http://localhost:8080/oom.jsp?mb=4096
# oom.jsp

<%@ page import="java.util.*" %>

<%
    int targetMb = Integer.parseInt(request.getParameter("mb"));

    List<byte[]> memoryLeak = new ArrayList<>();

    for (int i = 0; i < targetMb; i += 10) {
        memoryLeak.add(new byte[10 * 1024 * 1024]); // 10MB

        out.println("Allocated: " + (i + 10) + " MB<br>");
        out.flush();

        Thread.sleep(100);
    }

    out.println("<br>DONE");
%>

 

테스트 전 JVM 옵션 설정(setenv.sh)

테스트를 제대로 관찰하려면 미리 tomcat의 setenv.sh에 아래와 같은 옵션들을 설정해두면 좋다.

  • $CATALINA_BASE/bin/setenv.sh (만약 파일이 없다면 그냥 만들어 주면 된다.)
# setenv.sh

# -----------------------------------------------------------------------------
# CATALINA OPTS
# -----------------------------------------------------------------------------
CATALINA_OPTS="$CATALINA_OPTS "
CATALINA_OPTS="$CATALINA_OPTS -Xms4g -Xmx4g"
CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC"
CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/dumps/heapdumps"
CATALINA_OPTS="$CATALINA_OPTS -XX:+ExitOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError"
CATALINA_OPTS="$CATALINA_OPTS -Xlog:gc*:file=$CATALINA_BASE/logs/gc.log:time,uptime,level,pid,tid,tags:filecount=10,filesize=100M"

'성능과 튜닝 > 성능 및 부하 테스트' 카테고리의 다른 글

코어 웹 바이탈(CWV)  (0) 2024.09.05