Seperti yang disebutkan ckhan, jstack
sangat bagus karena memberikan jejak tumpukan penuh dari semua utas aktif di JVM. Hal yang sama dapat diperoleh di stderr JVM menggunakan SIGQUIT.
Alat lain yang berguna adalah jmap
yang dapat mengambil heap dump dari proses JVM menggunakan PID proses:
jmap -dump:file=/tmp/heap.hprof $PID
Heap dump ini dapat dimuat di alat seperti visualvm
(yang sekarang menjadi bagian dari instalasi Oracle java sdk standar, bernama jvisualvm). Selain itu, VisualVM dapat terhubung ke JVM yang sedang berjalan dan menampilkan informasi tentang JVM, termasuk menampilkan grafik penggunaan CPU internal, jumlah thread, dan penggunaan heap - bagus untuk melacak kebocoran.
Alat lain, jstat
, dapat mengumpulkan statistik pengumpulan sampah untuk JVM selama jangka waktu tertentu seperti vmstat ketika dijalankan dengan argumen numerik (mis. vmstat 3
).
Terakhir, Java Agent dapat digunakan untuk mendorong instrumentasi pada semua metode dari semua objek pada waktu muat. Pustaka javassist
dapat membantu untuk membuat ini sangat mudah dilakukan. Jadi, layak untuk menambahkan tracing Anda sendiri. Bagian tersulitnya adalah menemukan cara untuk mendapatkan keluaran pelacakan hanya saat Anda menginginkannya dan tidak setiap saat, yang kemungkinan akan memperlambat JVM menjadi perayapan. Ada sebuah program bernama dtrace
yang bekerja dengan cara seperti ini. Saya sudah mencobanya, tetapi tidak terlalu berhasil. Perhatikan bahwa agen tidak dapat menginstrumentasi semua kelas karena yang diperlukan untuk mem-bootstrap JVM dimuat sebelum agen dapat menginstrumentasi, dan sudah terlambat untuk menambahkan instrumentasi ke kelas tersebut.
Saran Saya - mulai dengan VisualVM dan lihat apakah hal itu memberi tahu Anda apa yang perlu Anda ketahui karena dapat menampilkan utas saat ini dan statistik penting untuk JVM.
Sama sia-sia ketika men-debug program yang salah pada sistem Linux, Anda dapat menggunakan alat serupa untuk men-debug JVM yang berjalan di sistem Anda.
Alat #1 - jvmtop
Mirip dengan top
, Anda dapat menggunakan jvmtop untuk melihat kelas apa yang sedang berjalan di dalam JVM yang sedang berjalan di sistem Anda. Setelah diinstal, Anda menjalankannya seperti ini:
$ jvmtop.sh
Outputnya memiliki gaya serupa agar terlihat seperti alat top
:
JvmTop 0.8.0 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
Alat #2 - jvmmonitor
Alternatif lain adalah menggunakan jvmmonitor. JVM Monitor adalah profiler Java yang terintegrasi dengan Eclipse untuk memantau penggunaan CPU, thread, dan memori aplikasi Java. Anda dapat menggunakannya untuk secara otomatis menemukan JVM yang sedang berjalan di localhost atau dapat terhubung ke JVM jarak jauh menggunakan [email protected]
Alat #3 - visualvm
visualvm mungkin adalah "alat" yang harus dijangkau saat men-debug masalah dengan JVM. Kumpulan fiturnya cukup dalam dan Anda bisa melihat jeroan secara mendalam.
Membuat profil kinerja aplikasi atau menganalisis alokasi memori:
Ambil dan tampilkan thread dump:
Referensi
- tutorial visualvm
Pertimbangkan jstack
.Tidak cocok untuk strace
, lebih dari pstack
-analog, tetapi setidaknya akan memberi Anda gambaran tentang snapshot tepat waktu. Bisa merangkai mereka bersama untuk mendapatkan jejak kasar jika Anda harus.
Lihat juga saran di artikel SO ini:https://stackoverflow.com/questions/1025681/call-trace-in-java