Saya menggunakan kill -3
perintah untuk melihat dump thread JVM di unix. Tetapi di mana saya dapat menemukan output dari kill
perintah ini ? Saya tersesat!!
Saya menggunakan kill -3
perintah untuk melihat dump thread JVM di unix. Tetapi di mana saya dapat menemukan output dari kill
perintah ini ? Saya tersesat!!
Jawaban:
Sebagai alternatif, Anda dapat menggunakan jstack (Disertakan dengan JDK) untuk mengambil thread dump dan menulis hasilnya di mana pun Anda inginkan. Apakah itu tidak tersedia di lingkungan unix?
jstack PID > outfile
Thread dump ditulis ke sistem dari VM tempat Anda mengeksekusi kill -3
. Jika Anda mengarahkan output konsol JVM ke file, thread dump akan ada di file itu. Jika JVM berjalan di konsol terbuka, maka thread dump akan ditampilkan di konsolnya.
Ada cara untuk mengalihkan output dump thread JVM pada sinyal putus ke file terpisah dengan opsi diagnostik LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Dengan Java 8 dalam gambar, jcmd
adalah pendekatan yang lebih disukai.
jcmd <PID> Thread.print
Berikut adalah cuplikan dari dokumentasi Oracle :
Rilis JDK 8 memperkenalkan Java Mission Control, Java Flight Recorder, dan utilitas jcmd untuk mendiagnosis masalah dengan aplikasi JVM dan Java. Disarankan untuk menggunakan utilitas terbaru, jcmd, bukan utilitas jstack sebelumnya untuk meningkatkan diagnostik dan mengurangi overhead kinerja.
Namun, mengirimkan ini dengan aplikasi mungkin merupakan implikasi lisensi yang saya tidak yakin.
jcmd
gagal terhubung ke proses layanan windows dengan com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
sementara jstack -F
berhasil: stackoverflow.com/questions/1197912/…
Saat menggunakan kill -3, seseorang akan melihat thread dump dalam output standar. Sebagian besar server aplikasi menulis keluaran standar ke file terpisah. Anda harus menemukannya di sana saat menggunakan kill -3. Ada beberapa cara untuk mendapatkan thread dump:
kill -3 <PID>
: Memberikan keluaran ke keluaran standar.Untuk VM hotspot kita juga dapat menggunakan jstack
perintah untuk menghasilkan thread dump. Ini adalah bagian dari JDK. Sintaksnya adalah sebagai berikut:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
seharusnya tidak membunuh JVM. Jenis aplikasi Java apa yang Anda lihat?
Langkah-langkah yang harus Anda ikuti jika Anda ingin thread dump dari Proses Java StandAlone Anda
Langkah 1: Dapatkan ID Proses untuk skrip shell yang memanggil program java
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
Langkah 2: Dapatkan ID Proses untuk Anak yang Diminta oleh runABCD. Gunakan PID di atas untuk mendapatkan anak-anaknya.
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
Langkah 3: Dapatkan JSTACK untuk proses tertentu. Dapatkan ID Proses dari proses XYSServer Anda. yaitu 8536
linux$ jstack **8536** > threadDump.log