kill -3 untuk mendapatkan java thread dump

116

Saya menggunakan kill -3perintah untuk melihat dump thread JVM di unix. Tetapi di mana saya dapat menemukan output dari killperintah ini ? Saya tersesat!!

javanerd.dll
sumber
Proses mana yang Anda bunuh? Apakah ini server aplikasi J2EE? Jika itu kasusnya, Anda harus menemukan jejak tumpukan dalam standar keluar.
Luciano Fiandesio
Saya
menghentikan
2
Seharusnya yang menulis dump thread di konsol. karena kelas java memiliki konsol sebagai std out
javanerd

Jawaban:

194

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
Joshua McKinnon
sumber
1
Ya - pada saat dijalankan. Anda juga dapat menentukan -l (huruf kecil L) untuk daftar panjang yang mencetak informasi kunci tambahan
Joshua McKinnon
2
Hingga perintah jstack gagal secara konsisten karena "Tidak dapat menyimpulkan jenis utas dari alamat" ;-(
noahlz
1
Jika Anda melihat kesalahan itu, saya sarankan untuk memperbaikinya dengan vendor Anda. Pencarian cepat menunjukkan, misalnya, ada bug terbuka di RHEL terkait kesalahan ini dan openjdk ...
Joshua McKinnon
7
Perlu dicatat bahwa jstack membutuhkan JDK. Jika Anda menjalankan aplikasi di server yang hanya menginstal JRE, Anda harus mencari cara lain untuk thread dumping.
jeffkempf
1
Berikut adalah cara menggunakan jstack untuk mendapatkan thread dump dari proses yang berjalan di bawah pengguna yang berbeda, seperti layanan windows: stackoverflow.com/questions/1197912/…
Vadzim
44

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.

Kris Babic
sumber
1
Ada cara untuk mengarahkan output dump thread JVM ke file terpisah. Lihat jawaban saya.
Vadzim
32

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
Vadzim
sumber
5
Secara teknis, ini tidak "mengalihkan" keluaran thread dump. Ini menyalakan JVM yang masuk ke jvm.log (yang menyertakan keluaran dump thread) tetapi kill -QUIT masih akan dibuang ke stdout proses (juga). Suara positif untuk deskripsi opsi JVM yang tidak jelas :)
sqweek
25

Dengan Java 8 dalam gambar, jcmdadalah 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.

Arnab Biswas
sumber
1
Sayangnya jcmdgagal terhubung ke proses layanan windows dengan com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachsementara jstack -Fberhasil: stackoverflow.com/questions/1197912/…
Vadzim
1
Anda perlu menjalankan jcmd <pid> Thread.dump di bawah pengguna yang sama dengan proses java, jika tidak koneksi Anda akan terputus. Lihat stackoverflow.com/questions/25438983/…
Twilite
11

Di lokasi yang sama di mana stdout JVM ditempatkan. Jika Anda memiliki server Tomcat, ini adalah catalina_(date).outfilenya.

Daniel
sumber
8

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.
  • Jika seseorang memiliki akses ke jendela konsol tempat server berjalan, seseorang dapat menggunakan Ctrl+ Breakkombinasi kunci untuk menghasilkan pelacakan tumpukan di STDOUT.
  • Untuk VM hotspot kita juga dapat menggunakan jstackperintah 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]
Apoorve
sumber
Saya mengalami masalah saat menggunakan Kill -3 <PID>. Ini berfungsi dengan baik tetapi membunuh proses juga setelah menulis thread dump ke konsol. Apakah itu seharusnya melakukan itu?
Ashley
@ Ashley - no kill -3 <PID>seharusnya tidak membunuh JVM. Jenis aplikasi Java apa yang Anda lihat?
slm
2

Di Jboss Anda dapat melakukan hal berikut

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Ini akan mengarahkan output / threadump Anda ke konsol file yang ditentukan dalam perintah di atas.

anish
sumber
2
  1. Temukan id proses [ID PS]
  2. Jalankan jcmd [PS ID] Thread.print
Mehmet Erdemsoy
sumber
2

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
Nick
sumber