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