Apakah ada cara saya bisa mendapatkan daftar semua thread yang sedang berjalan di JVM saat ini (termasuk utas yang tidak dimulai oleh kelas saya)?
Apakah mungkin untuk mendapatkan Thread
dan Class
objek dari semua utas dalam daftar?
Saya ingin dapat melakukan ini melalui kode.
java
multithreading
jvm
Kryten
sumber
sumber
Dapatkan pegangan ke root
ThreadGroup
, seperti ini:Sekarang, panggil
enumerate()
fungsi pada grup root berulang kali. Argumen kedua memungkinkan Anda mendapatkan semua utas, secara rekursif:Perhatikan bagaimana kami memanggil enumerate () berulang kali hingga array cukup besar untuk memuat semua entri.
sumber
rootGroup
, Anda harus menggunakannew Thread[rootGroup.activeCount()+1]
.activeCount()
bisa menjadi nol, dan jika itu Anda akan mengalami loop tak terbatas.Ya, lihatlah untuk mendapatkan daftar utas . Banyak contoh di halaman itu.
Itu untuk melakukannya secara terprogram. Jika Anda hanya ingin daftar di Linux setidaknya Anda bisa menggunakan perintah ini:
dan VM akan melakukan thread dump ke stdout.
sumber
Anda bisa mendapatkan banyak informasi tentang utas dari ThreadMXBean .
Panggil metode ManagementFactory.getThreadMXBean () statis untuk mendapatkan referensi ke MBean.
sumber
Apakah Anda sudah melihat jconsole ?
Ini akan mencantumkan semua utas yang berjalan untuk proses Java tertentu.
Anda dapat memulai jconsole dari folder bin JDK.
Anda juga bisa mendapatkan jejak tumpukan penuh untuk semua utas dengan menekan
Ctrl+Break
di Windows atau dengan mengirimkill pid --QUIT
di Linux.sumber
Pengguna Apache Commons dapat digunakan
ThreadUtils
. Implementasi saat ini menggunakan pendekatan walk the thread group yang telah diuraikan sebelumnya.sumber
Anda dapat mencoba sesuatu seperti ini:
dan Anda jelas bisa mendapatkan lebih banyak karakteristik utas jika Anda membutuhkan.
sumber
Di Groovy Anda dapat memanggil metode pribadi
Di Jawa , Anda bisa memanggil metode itu menggunakan refleksi asalkan manajer keamanan mengizinkannya.
sumber
Cuplikan kode untuk mendapatkan daftar utas dimulai oleh utas utama:
keluaran:
Jika Anda memerlukan semua utas termasuk utas sistem, yang belum dimulai oleh program Anda, hapus kondisi di bawah ini.
Sekarang output:
sumber
sumber
Di konsol java, tekan Ctrl-Break . Ini akan mencantumkan semua utas ditambah beberapa informasi tentang heap. Ini tidak akan memberi Anda akses ke objek tentu saja. Tapi itu bisa sangat membantu untuk debugging.
sumber
Untuk mendapatkan daftar utas dan status lengkapnya menggunakan terminal, Anda dapat menggunakan perintah di bawah ini:
PID mana yang merupakan id proses yang berjalan di komputer Anda. Untuk mendapatkan id proses dari proses java Anda, Anda cukup menjalankan
jps
perintah.Selain itu, Anda dapat menganalisis dump thread Anda yang dihasilkan oleh jstack di TDA (Thread Dump Analyzer) seperti alat penganalisa benang fastthread atau spotify .
sumber
ManagementFactory.getThreadMXBean().getAllThreadIds()
sumber