Giriş
Not : Thread dump olmak için jstack yerine jcmd komutu Thread.print seçeneği komutu kullanılabilir.
Not : Thread dump olmak için jstack yerine jcmd komutu Thread.print seçeneği komutu kullanılabilir.
Açıklaması şöyle.
Şöyle yaparız.
Prints Java thread stack traces for a Java process, core file, or remote debug server. This command is experimental and unsupported.Linux'ta "kill -3" ile aynıdır. Açıklaması şöyle.
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.
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
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