GNU/Linux >> Belajar Linux >  >> Linux

Linux – Bagaimana Melacak Program Java?

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:

  1. Jika tidak ada yang membantu – RTFM
  2. 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.

Terkait:Linux – Menemukan substring dalam file di seluruh subdirektori dengan satu perintah bawaan?

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.


Linux
  1. Cara menginstal Python di Linux

  2. Bagaimana saya menggunakan cron di Linux

  3. Cara menginstal Java di Linux

  1. Cara menggunakan BusyBox di Linux

  2. Cara mempartisi disk di Linux

  3. Cara menggunakan Perintah Su di Linux

  1. Cara menginstal Linux dalam 3 langkah

  2. Cara memindahkan file di Linux

  3. Bagaimana cara melacak operasi IO per file di Linux?