VisualVM 이란❓
VisualVM은 Java 애플리케이션의 성능 모니터링을 위한 도구입니다.
실행 중인 Java 프로세스의 CPU, 메모리 사용량, GC 동작, 스레드 상태 등을 실시간으로 확인할 수 있고,
원격 JMX 연결을 통해 리눅스 서버에서 실행 중인 Java 애플리케이션에도 연결하여 실시간 모니터링 할 수 있습니다.
• CPU 사용량, 메모리 사용량 확인
• GC(Garbage Collection) 상태 확인
• Thread 상태 추적
• Heap Dump 분석
• Deadlock 탐지

📎Application Tabs 설명
각 탭에 우클릭을 통해 모니터링 파일을 추가하고, 연결할 수 있습니다.

📌 Local - 내 PC에서 실행 중인 Java 애플리케이션 목록입니다.
📌 Remote - 원격 서버에서 실행 중인 Java 애플리케이션 목록입니다.
📌 Logfiles - Java 애플리케이션 실행 중 생성된 로그 파일을 확인할 수 있습니다.
📌 VM Coredumps - Java Virtual Machine(JVM) 충돌 시 생성된 덤프 파일로, 문제 원인을 분석하는 데 사용됩니다.
📌 JFR Snapshots - Java Flight Recorder(JFR)에서 수집한 실행 기록 데이터로, 애플리케이션의 성능을 분석할 때 활용됩니다.
📌 Snapshots - 실행 중인 애플리케이션의 Heap Dump 또는 CPU 프로파일링 데이터를 저장한 파일로 성능 이슈를 분석할 때 중요한 데이터 입니다.
📌 Coherence Clusters - Oracle Coherence 기반의 분산 캐시 클러스터를 모니터링하는 기능입니다.
📎설정방법
✳️ 프로세스 설정파일 수정
리눅스 서버에 올려놓은 프로세스 실행파일의 설정파일 내용을 수정합니다.(.sh)
To-be의 JMX Config 부분을 (Spring Config위쪽에)추가하고, else 아래에 실행옵션으로 추가하였습니다.
임의로 설정하는 포트같은 경우에는, '10.101.101.95:2022' 서버에 여러개의 프로세스가 존재한다면
포트번호를 모두 다르게 설정해주어야 합니다. ex) 서비스1 = 29887, 서비스2 = 29888
AS-IS :
#!/bin/sh
JAVA_PATH=/usr/local/JAVA/jdk1.8.0_111/bin/java
#JAVA_PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/bin/java
HERE_PATH=/svc/app/ami/ami-data
SERVICE_NAME=amidata
APP_NAME=ami-data
PID_FILE=${HERE_PATH}/pid/${SERVICE_NAME}.pid
JAR_NAME=${SERVICE_NAME}.jar
## GC config
GC_LOG_PATH=/logs/gcLog/${SERVICE_NAME}/gc.log
JAVA_OPTION="${JAVA_OPTION} -Xms1024M -Xmx4096M -XX:MaxMetaspaceSize=256m"
JAVA_OPTION="${JAVA_OPTION} -XX:+UseConcMarkSweepGC"
JAVA_OPTION="${JAVA_OPTION} -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCDetails"
JAVA_OPTION="${JAVA_OPTION} -Xloggc:${GC_LOG_PATH}"
JAVA_OPTION="${JAVA_OPTION} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=9 -XX:GCLogFileSize=20m"
## Spring config
SPRING_OPTION="${SPRING_OPTION} -Dspring.config.location=../config/ -Dspring.profiles.active=dev"
#SPRING_OPTION="${SPRING_OPTION} -Dspring.config.location=../config/ -Dspring.profiles.active=${Profile}"
mkdir -p /logs/gcLog/amiservice
case $1 in
start)
echo ""
PCOUNT=`ps -ef |grep '${APP_NAME}' |grep -v grep |wc -l`
echo "pcount=${PCOUNT}"
if [ $PCOUNT -ne 0 ]
then
echo "already run ${APP_NAME} . pid:`cat $PID_FILE`"
else
# ${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JAR_NAME} 1>&2 &
${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JAR_NAME} > /dev/null 2> /dev/null < /dev/null &
echo "$!" > ${PID_FILE}
echo "START ${SERVICE_NAME}. pid:$!"
ps -ef |grep `cat ${PID_FILE}` |grep -v grep
fi
echo ""
;;
stop)
echo ""
kill -9 `cat ${PID_FILE}`
echo "STOP ${SERVICE_NAME}. pid:`cat ${PID_FILE}`"
echo ""
;;
status)
echo ""
echo "STATUS ${APP_NAME}."
ps -ef |grep ${APP_NAME} |grep -v grep |grep `cat ${PID_FILE}`
echo ""
;;
*)
echo "./run.sh start|stop|status"
esac
TO-BE :
## 추가
## JMX config
JMX_OPTION="-Dcom.sun.management.jmxremote"
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.authenticate=false"
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.ssl=false"
JMX_OPTION="${JMX_OPTION} -Djava.rmi.server.hostname=10.101.101.95" #리눅스 서버주소
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.port=25445" #임의 포트번호 설정
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.rmi.port=25445" #임의 포트번호 설정
## 수정 - ${JMX_OPTION} 추가
else
# ${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JMX_OPTION} ${JAR_NAME} 1>&2 &
${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JMX_OPTION} ${JAR_NAME} > /dev/null 2> /dev/null < /dev/null &
✳️ 프로세스 설정파일 수정
프로세스 재기동을 합니다. 저의 프로세스에서는 ./run.sh start|stop|status로 실행 명령어를 작성하는데.
./run.sh stop -> ./run.sh start로 재기동 해주었습니다.
✳️ jmx 포트 확인
위에 설정파일에 임의로 설정한 포트번호를 조회합니다.
조회되지 않으면 제대로 설정되지 않은거에요.
netstat -anl | grep 25445
✳️ VisualVM에 remote서버 추가
Application-Remote 탭에 우클릭하여 Add Remote Host로 연결할 외부서버를 추가합니다.

✳️ VisualVM에 jmx 추가
추가한 Remote 서버에 우클릭하여 jmx를 추가합니다. (Add jmx Connection..)
위에서 임의로 추가한 포트번호만 뒤에 작성해주면 됩니다.
📌 Use security credential 항목은 체크❌
📌 Do not require SSL connection 항목을 체크⭕ - SSL 접속을 하지 않게

✳️ 모니터링 시작
위에서 .sh 프로세스 실행파일을 정상적으로 작동한 상태라면 여기에 모니터링이 표시됩니다.
(동그라미 친 아이콘쪽에 불이안들어와 있고 흑백으로 표시되면, 연결되지 않은것이니 확인하세요)

jmx 포트로 연결한 파일을 하나씩 선택하여 모니터링하고, 부하테스트 결과로 캡쳐하여 활용할 수 있습니다.

'Coding > Back-end' 카테고리의 다른 글
OOM 분석 | heap dump 파일분석 - VisualVM, Eclipse MAT (0) | 2025.04.01 |
---|---|
로컬에서 리눅스 서버로 파일 옮기기 | SCP • SFTP (0) | 2025.03.19 |
[Jmeter] 요청 전송주기 설정 라이브러리 - Timer 설정 (0) | 2025.03.13 |
[IntelliJ] AWS 프로젝트 Clone 하기 - CLI 명령어 | Console CodeCommit Repository (0) | 2025.03.10 |
[Jmeter] apache jmeter에서 host에 접근하지 못할때 | dev-kafka 오류 | di-kafkameter 오류 | jmeter timeout exception (0) | 2025.03.07 |