IT/Linux
JVM Thread dump 확인 방법
twofootdog
2025. 2. 12. 21:02
1. JVM Thread dump 확인 방법
1) 아래와 같은 Shell 생성 후 수행
#!/bin/sh
PID=`ps -ef | grep java | grep -v grep | awk '{print $2}'`
echo "PID is ${PID}"
# 3회 수행
for num in 1 2 3
do
DATE=`date +%Y%m%d%H%M%S`
# 선 thread dump
jstack $PID > before_dump_$DATE.txt
# high cpu의 thread 검색(아래 중 택1)
# ps -lmT ${PID} > high_cpu_thread_$DATE.txt
# top -Hbn1 -p ${PID} > high_cpu_thread_$DATE.txt
top -H -n1 -p ${PID} -b > high_cpu_thread_$DATE.txt
# 후 thread dump
jstack $PID > after_dump_$DATE.txt
echo "TOP and THREAD dump complete #" $num
# 2초 간격으로 3 회 실시
if [ $num -ne 3 ]; then
sleep 2
echo "sleep"
fi
done
2) Shell 을 수행하면 high_cpu_thread.txt 파일에 cpu 사용율 기준으로 내림차순으로 정렬되어 thread 목록 생성
3) PID를 16진수로 변환(아래 예시로는 PID 98을 16진수로 변환하면 0x62, 16진수가 영문자이면 소문자). 16진수는 windows 계산기 프로그래머 버전으로 사용하면 편리(계산기 -> 좌측 상단 햄버거 버튼 클릭 -> 프로그래머 선택)
%Cpu(s): 70.3 us, 8.1 sy, 0.0 ni, 15.8 id, 0.1 wa, 0.0 hi, 2.6 si, 0.0 st
MiB Mem : 253677.7 total, 197597.0 free, 45036.1 used, 13255.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 208641.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
98 iuser 20 0 4196596 1.1g 20288 R 18.2 0.5 0:05.50 http-ni+
4) 16진수 PID를 가지고 before_dump / after_dump.txt 파일 검색. cpu 사용율이 높은 PID가 어떤 thread인지 확인 가능
2. 참고사항
docker 환경이 alpine linux인 경우, alpine는 Busybox의 top, ps 명령어 제약이 많아(sort 수행 불가 등), 위 shell을 수행하기 위해서는 이미지 빌드 시 GNU top, ps 설치가 필요
RUN apk add --no-cache procps