들어가며
다양한 이유로 메모리 누수 테스트를 진행해 봐야 하는 경우가 종종 발생한다.
가령 예를 들면 아래와 같은 경우이다.
- 실제 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 |
|---|