17 Temmuz 2018 Salı

jstack komutu - Thread Dump Alır

Giriş
Not : Thread dump olmak için jstack yerine jcmd komutu Thread.print seçeneği komutu kullanılabilir.
Açıklaması şöyle.
Prints Java thread stack traces for a Java process, core file, or remote debug server. This command is experimental and unsupported.

This utility is unsupported and might not be available in future release of the JDK. In Windows Systems where the dbgeng.dll file is not present, Debugging Tools For Windows must be installed so these tools work.
Linux'ta "kill -3" ile aynıdır. Açıklaması şöyle.
The output from the jstack pid option is the same as that obtained by pressing Ctrl+\ at the application console (standard input) or by sending the process a QUIT signal.
Söz dizimi şöyle
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip
Örnek
Şöyle yaparız
# old schoool
jstack <pid>

# more modern
jcmd <pid> Thread.print
jcmd <class-name> Thread.print

# If no JDK, SIGQUIT dumps threads to System.out, extract from there
#   (this will just send a signal to the app, not trigger a shutdown)
kill -QUIT <pid>

# For a Kubernetes pod the java pid is typically 1
kubectl exec <pod-name> -- jstack 1
Örnek
Şöyle yaparız
jstack JAVA_PROCESS_ID > /tmp/THREAD_DUMP_FILENAME.tdump
Örnek
Şöyle yaparız. Burada 21742 numaralı process'in veya Linux olduğu için thread'in durumunu görmek istiyoruz. Sayı önce hexadecimal yapılır. Daha sonra jstack ile çıktıya bakılır
printf "%x\n" 21742

# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]
-l seçeneği
Açıklaması şöyle
long listing. Prints additional information about locks
Örnek
Şöyle yaparız.
jstack -l [application_pid] > threaddump.txt
Örnek
Arka arkaya thread dump almak için bash ile şöyle yaparız. "threaddump_tarih" isimli dosyalar oluşturur
#!/bin/bash
if [ “$#” -ne 3 ]; then
  echo “usage: sh thread.sh <pid> <number-of-dumps> <interval>”
  exit
fi

count=$2
for i in `seq 1 $count`;
do
  jstack -l $1 > threaddump_`date “+%F-%T”`.txt &
  ps — pid $1 -Lo pid,tid,%cpu,time,nlwp,c > threadusage_`date “+%F-%T”`.txt &
  if [ $i -ne $count ]; then
    echo “sleeping for $3 [$i]”
    sleep $3
  fi
done
Çağırmak için şöyle yaparız
sh thread.sh 1234 20 5s
Time unit olarak şunları kullanabiliriz
Available time units

s for seconds (the default)
m for minutes.
h for hours.
d for days.
Bu betik thread dump alırken aynı zamanda threadusage_ABC.txt gibi bir dosya oluşturur. dosya şöyle. Üçüncü sütuna bakarız en çok işlemci kullanan thread 960783
PID    TID    %CPU TIME     NLWP C

959023 960779 0.0  00:00:00 6984 0

959023 960780 0.0  00:00:00 6984 0

959023 960781 0.0  00:00:01 6984 0

959023 960782 0.0  00:00:00 6984 0

959023 960783 42.7 07:45:57 6984 42

959023 960784 0.0  00:00:00 6984 0

959023 960785 0.0  00:00:01 6984 0
Bu değeri hexadecimal sayıya çeviririz. Sonuç 0xea90f ve thread dump dosyasında ararız. Thread dump çıktısı şöyle. nid kısaltması Native Identifier anlamına gelir. Yani Thread ID
"HTTPS-Sender I/O dispatcher-1" prio=10 tid=... nid=0xea90f runnable [0x00007fb534e20000]
    java.lang.Thread.State: RUNNABLE



-m seçeneği
Belirtilen process'e bağlanır
Örnek
Şöyle yaparız.
$ jstack -m 7219
Şuna benzer bir çıktı alırız.
Attaching to process ID 7219, please wait...
Debugger attached successfully.
Server compiler detected.
  JVM version is 25.162-b12
...

Hiç yorum yok:

Yorum Gönder