Saya memiliki aplikasi Java yang saya jalankan dari konsol yang pada gilirannya mengeksekusi proses Java lain. Saya ingin mendapatkan dump thread / heap dari proses anak itu.
Di Unix, saya bisa melakukan kill -3 <pid>
tetapi pada Windows AFAIK satu-satunya cara untuk mendapatkan thread dump adalah Ctrl-Break di konsol. Tapi itu hanya memberi saya dump dari proses orang tua, bukan anak.
Apakah ada cara lain untuk mendapatkan heap dump?
java
jvm
heap-dump
thread-dump
Kasun Siyambalapitiya
sumber
sumber
Jawaban:
Anda dapat menggunakan
jmap
untuk mendapatkan dump dari setiap proses yang berjalan, dengan asumsi Anda tahupid
.Gunakan Task Manager atau Resource Monitor untuk mendapatkan
pid
. Kemudianuntuk mendapatkan tumpukan untuk proses itu.
sumber
Anda membingungkan dua dump java yang berbeda.
kill -3
menghasilkan dump thread, bukan heap dump.Untuk mengambil thread dump di Windows, CTRL+ BREAKjika JVM Anda adalah proses latar depan adalah cara paling sederhana. Jika Anda memiliki shell seperti unix di Windows seperti Cygwin atau MobaXterm, Anda dapat menggunakannya
kill -3 {pid}
seperti yang Anda bisa di Unix.Untuk mengambil thread dump di Unix, CTRL+ Cjika JVM Anda adalah proses foreground atau
kill -3 {pid}
akan berfungsi selama Anda mendapatkan PID yang tepat untuk JVM.Dengan platform mana pun, Java dilengkapi dengan beberapa utilitas yang dapat membantu. Untuk kesedihan thread,
jstack {pid}
adalah taruhan terbaik Anda. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.htmlHanya untuk menyelesaikan pertanyaan dump: Heap dumps tidak umum digunakan karena mereka sulit diinterpretasikan. Tetapi, mereka memiliki banyak informasi berguna di dalamnya jika Anda tahu di mana / bagaimana melihatnya. Penggunaan paling umum adalah menemukan kebocoran memori. Ini adalah praktik yang baik untuk mengatur
-D
pada baris perintah java sehingga heap dump dihasilkan secara otomatis pada OutOfMemoryError,-XX:+HeapDumpOnOutOfMemoryError
Tapi, Anda juga dapat secara manual memicu heap dump, juga. Cara paling umum adalah dengan menggunakan utilitas javajmap
.CATATAN: utilitas ini tidak tersedia di semua platform. Pada JDK 1.6,
jmap
tersedia di Windows.Contoh baris perintah akan terlihat seperti
Output "myheap.bin" tidak dapat dibaca oleh manusia (bagi kebanyakan dari kita), dan Anda akan memerlukan alat untuk menganalisisnya. Preferensi saya adalah MAT. http://www.eclipse.org/mat/
sumber
Saya pikir cara terbaik untuk membuat file .hprof dalam proses Linux adalah dengan perintah jmap . Sebagai contoh:
jmap -dump:format=b,file=filename.hprof {PID}
sumber
Selain menggunakan jconsole / visualvm yang disebutkan, Anda dapat menggunakan
jstack -l <vm-id>
pada jendela baris perintah lain, dan menangkap output itu.<vm-id> dapat ditemukan menggunakan task manager (ini adalah id proses di windows dan unix), atau menggunakan
jps
.Keduanya
jstack
danjps
sudah termasuk dalam Sun JDK versi 6 dan lebih tinggi.sumber
Saya merekomendasikan Java VisualVM yang didistribusikan dengan JDK (jvisualvm.exe). Itu dapat terhubung secara dinamis dan mengakses utas dan tumpukan. Saya menemukan sangat berharga untuk beberapa masalah.
sumber
Jika Anda menggunakan server-jre 8 ke atas, Anda dapat menggunakan ini:
sumber
Coba salah satu opsi di bawah ini.
Untuk JVM 32 bit:
Untuk JVM 64 bit (mengutip secara eksplisit):
Untuk JVM 64 bit dengan algoritma G1GC dalam parameter VM (Hanya tumpukan objek langsung yang dihasilkan dengan algoritma G1GC):
Pertanyaan SE terkait: Java heap dump error dengan perintah jmap: Premature EOF
Lihat berbagai opsi
jmap
di artikel inisumber
Jika Anda ingin heapdump kehabisan memori, Anda dapat memulai Java dengan opsi
-XX:-HeapDumpOnOutOfMemoryError
cf halaman referensi Opsi JVM
sumber
Anda dapat menjalankan
jconsole
(disertakan dengan Java 6's SDK) kemudian terhubung ke aplikasi Java Anda. Ini akan menunjukkan kepada Anda setiap Thread yang berjalan dan jejak tumpukannya.sumber
Anda dapat mengirim
kill -3 <pid>
dari Cygwin. Anda harus menggunakanps
opsi Cygwin untuk menemukan proses windows kemudian hanya mengirim sinyal ke proses itu.sumber
Anda harus mengarahkan output dari java kedua yang dapat dieksekusi ke beberapa file. Kemudian, gunakan SendSignal untuk mengirim "-3" ke proses kedua Anda.
sumber
Jika Anda menggunakan JDK 1.6 atau lebih tinggi, Anda dapat menggunakan
jmap
perintah untuk mengambil tumpukan Dump dari proses Java, syaratnya Anda harus tahu ProcessID.Jika Anda menggunakan Windows Machine, Anda dapat menggunakan Task Manager untuk mendapatkan PID. Untuk mesin Linux Anda dapat menggunakan varietas perintah seperti
ps -A | grep java
ataunetstat -tupln | grep java
atautop | grep java
, tergantung pada aplikasi Anda.Kemudian Anda dapat menggunakan perintah seperti di
jmap -dump:format=b,file=sample_heap_dump.hprof 1234
mana 1234 adalah PID.Ada variasi alat yang tersedia untuk menafsirkan file hprof. Saya akan merekomendasikan alat visualvm Oracle, yang mudah digunakan.
sumber
Jika Anda tidak dapat (atau tidak ingin) menggunakan konsol / terminal karena alasan tertentu, ada solusi alternatif. Anda dapat membuat aplikasi Java mencetak tempat utas untuk Anda. Kode yang mengumpulkan Jejak Tumpukan adalah wajar sederhana dan dapat dilampirkan ke tombol atau antarmuka web.
Metode ini akan mengembalikan string yang terlihat seperti ini:
Bagi mereka yang tertarik dengan versi Java 8 dengan stream, kodenya bahkan lebih ringkas:
Anda dapat dengan mudah menguji kode ini dengan:
sumber
Script berikut menggunakan PsExec untuk terhubung ke Sesi Windows lain sehingga berfungsi bahkan ketika terhubung melalui Remote Desktop Service.
Saya menulis skrip batch kecil untuk Java 8 (menggunakan
PsExec
danjcmd
) bernamajvmdump.bat
, yang membuang thread, heap, properti sistem, dan args JVM.Itu harus dijalankan dalam sesi Windows yang sama dari pengguna yang memulai JVM, jadi jika Anda terhubung melalui Remote Desktop Anda mungkin perlu meluncurkan command prompt
Session 0
dan menjalankannya dari sana. misalnyaIni akan meminta Anda (klik ikon bilah tugas di bagian bawah) ke
View the message
dalam sesi interaktif, yang akan membawa Anda ke konsol baru di sesi lain dari mana Anda dapat menjalankanjvmdump.bat
skrip.sumber
Bagaimana cara mendapatkan id proses aplikasi java?
Jalankan perintah 'jcmd' untuk mendapatkan proses id aplikasi java.
Bagaimana cara mendapatkan Thread dump?
jcmd PID Thread.print> thread.dump
Tautan referensi
Anda bahkan dapat menggunakan jstack untuk mendapatkan dump thread (jstack PID> thread.dump). Tautan referensi
Bagaimana cara mendapatkan heap dump?
Gunakan alat jmap untuk mendapatkan heap dump. jmap -F -dump: live, format = b, file = heap.bin PID
PID adalah singkatan dari id proses aplikasi. Tautan referensi
sumber
Mungkin jcmd ?
Utilitas Jcmd digunakan untuk mengirim permintaan perintah diagnostik ke JVM, di mana permintaan ini berguna untuk mengendalikan Rekaman Penerbangan Java, memecahkan masalah, dan mendiagnosis JVM dan Aplikasi Java.
Alat jcmd diperkenalkan dengan Oracle Java 7 dan sangat berguna dalam mengatasi masalah dengan aplikasi JVM dengan menggunakannya untuk mengidentifikasi ID proses Java (mirip dengan jps), mendapatkan heap dumps (mirip dengan jmap), memperoleh dumping benang (mirip dengan jstack ), melihat karakteristik mesin virtual seperti properti sistem dan flag baris perintah (mirip dengan jinfo), dan memperoleh statistik pengumpulan sampah (mirip dengan jstat). Alat jcmd telah disebut "pisau swiss-army untuk menyelidiki dan menyelesaikan masalah dengan aplikasi JVM Anda" dan "permata tersembunyi."
Inilah proses yang harus Anda gunakan dalam menjalankan
jcmd
:jcmd <pid> GC.heap_dump <file-path>
Lihat itu untuk informasi lebih lanjut tentang mengambil Java heap dump .
sumber
Tindak lanjut visualvm:
Jika Anda "tidak dapat terhubung" ke JVM Anda yang berjalan dari jvisualvm karena Anda tidak memulainya dengan argumen JVM yang tepat (dan itu ada di kotak jauh), jalankan
jstatd
di kotak jauh, kemudian, dengan asumsi Anda memiliki koneksi langsung, tambahkan itu sebagai "remote host" di visualvm, klik dua kali nama host, dan semua JVM lain di kotak itu akan secara ajaib muncul di visualvm.Jika Anda tidak memiliki "koneksi langsung" ke port pada kotak itu, Anda juga dapat melakukan ini melalui proxy .
Setelah Anda dapat melihat proses yang Anda inginkan, bor ke dalamnya dalam jvisualvm dan gunakan tab monitor -> tombol "heapdump".
sumber
Kode java di bawah ini digunakan untuk mendapatkan Heap Dump dari Proses Java dengan menyediakan PID. Program menggunakan koneksi JMX jarak jauh untuk membuang tumpukan. Mungkin bermanfaat bagi seseorang.
}
sumber
Untuk mengambil thread dump / heap dump dari proses java anak di windows, Anda perlu mengidentifikasi id proses anak sebagai langkah pertama.
Dengan mengeluarkan perintah: jps Anda akan bisa mendapatkan semua proses java Id yang berjalan di mesin windows Anda. Dari daftar ini Anda perlu memilih Id proses anak. Setelah Anda memiliki anak proses Id, ada berbagai opsi untuk menangkap dump thread dan heap dump.
Menangkap Dump Thread:
Ada 8 opsi untuk menangkap dump thread:
Rincian tentang setiap opsi dapat ditemukan di artikel ini . Setelah Anda menangkap dump thread, Anda dapat menggunakan alat seperti fastThread , Samuraito menganalisis dump thread.
Menangkap Tumpukan Tumpukan:
Ada 7 opsi untuk menangkap dump heap:
jmap
-XX: + HeapDumpOnOutOfMemoryError
jcmd
JVisualVM
JMX
Pendekatan Programatis
Konsol administratif
Rincian tentang setiap opsi dapat ditemukan di artikel ini . Setelah menangkap heap dump, Anda dapat menggunakan alat seperti alat Eclipse Memory Analysis , HeapHero untuk menganalisis heap dump yang ditangkap.
sumber
Pada Oracle JDK, kami memiliki perintah yang disebut jmap (tersedia di folder bin Home Java). penggunaan perintah datang sebagai berikut
Contoh: jmap -dump: live, format = b, file = heap.bin (pid)
sumber