Sebagai sysadmin saya terkadang menghadapi situasi, di mana sebuah program berperilaku tidak normal, sementara tidak membuat kesalahan sama sekali atau membuat pesan kesalahan yang tidak masuk akal.
Di masa lalu – sebelum java masuk – ada dua tindakan balasan:
- Jika tidak ada yang membantu – RTFM
- Bahkan jika 1. tidak membantu – lacak panggilan sistem dan lihat apa yang terjadi
Saya biasanya menggunakan strace -f
untuk tugas ini dengan Linux (OS lain memiliki alat pelacak serupa). Sekarang meskipun ini biasanya bekerja dengan baik untuk program kuno apa pun, jejaknya menjadi sangat kabur saat melakukan hal yang sama pada java -proses. Ada begitu banyak panggilan sistem yang tampaknya tidak terkait dengan tindakan nyata apa pun, sehingga sangat sulit untuk menelusuri melalui dump semacam itu.
Apakah ada cara yang lebih baik untuk melakukannya (jika kode sumber tidak tersedia)?
Jawaban yang Diterima:
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 dari 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 periode waktu seperti vmstat saat dijalankan dengan argumen numerik (mis. vmstat 3
).
Akhirnya, dimungkinkan untuk menggunakan Agen Java untuk mendorong instrumentasi pada semua metode semua objek pada waktu muat. Pustaka javassist
dapat membantu untuk membuat ini sangat mudah dilakukan. Jadi, layak untuk menambahkan tracing Anda sendiri. Bagian yang sulit dengan itu adalah menemukan cara untuk mendapatkan keluaran jejak hanya ketika Anda menginginkannya dan tidak setiap saat, yang kemungkinan akan memperlambat JVM untuk merangkak. Ada program bernama dtrace
yang bekerja dengan cara seperti ini. Saya sudah mencobanya, tetapi tidak terlalu berhasil. Perhatikan bahwa agen tidak dapat menginstruksikan semua kelas karena yang diperlukan untuk mem-bootstrap JVM dimuat sebelum agen dapat melakukan instrumentasi, dan kemudian sudah terlambat untuk menambahkan instrumentasi ke kelas tersebut.
Saran Saya – mulai dengan VisualVM dan lihat apakah itu memberi tahu Anda apa yang perlu Anda ketahui karena itu dapat menunjukkan utas saat ini dan statistik penting untuk JVM.