Selama penggunaan perangkat lunak Java, masalah aneh terkadang muncul secara tidak dapat dijelaskan. Masalah -masalah ini seringkali tidak dapat ditemukan menggunakan informasi log. Pada saat ini, kita perlu menganalisis masalah dengan memeriksa hubungan panggilan tumpukan utas di dalam proses.
Misalnya, ketika kami melakukan operasi, beberapa kotak peringatan akan muncul secara tidak dapat dijelaskan, beberapa di antaranya normal dan beberapa tidak. Untuk pesan peringatan kesalahan ini, bagaimana kita harus menemukan kode di lokasi mana memiliki kotak pop-up kesalahan? Kita perlu melihat berbagai utas perangkat lunak setelah kotak pop-up dan mencari tahu utas mana yang menyebabkan masalah. Tetapi kadang -kadang karena lingkungan, waktu dan masalah lainnya, kami tidak dapat menggunakan IDE untuk men -debug. Kami hanya dapat mengambil snapshot memori melalui perangkat lunak alat dan kemudian menganalisis informasi memori.
Hari ini saya memperkenalkan alat yang umum digunakan: JStack
JStack adalah alat yang dilengkapi dengan JDK dan juga merupakan perangkat lunak dengan laju penampilan yang sangat tinggi dalam penyetelan kinerja JVM. Jadi sangat penting untuk menguasainya.
JStack dapat menghasilkan snapshot utas dari titik saat ini dalam waktu JVM.
Snapshot utas adalah kumpulan tumpukan metode yang dijalankan oleh setiap utas dalam JVM saat ini. Alasan utama untuk menghasilkan snapshot utas:
1. Alasan jeda jangka panjang utas melalui snapshot benang, seperti kebuntuan antara benang, loop mati, dan penantian jangka panjang yang disebabkan oleh meminta sumber daya eksternal.
2. Tentukan sumber informasi pengecualian melalui analisis snapshot utas dari hubungan panggilan dari metode eksekusi saat ini.
Sangat mudah digunakan:
(PS: Premisnya adalah Anda sudah memiliki JDK dengan JStack. Yang terbaik adalah memiliki set variabel lingkungan.)
Langkah 1: Lihat PID proses melalui Windows Task Manager
Di sini kami secara singkat berbicara tentang apa itu PID: PID adalah identitas dari setiap proses. Ini adalah identitas unik yang ditugaskan oleh sistem operasi untuk mengidentifikasi identitas proses setelah perangkat lunak dimulai.
Seperti yang ditunjukkan
Di bawah tab Proses, Lihat> Pilih Kolom
Periksa PID dan konfirmasi
Beralih ke tab Aplikasi dan pilih memori program ke Snapshot. Gambar yang dipilih adalah Android Studio. Klik kanan untuk diproses.
Di sini kita dapat melihat bahwa PID Android Studio yang sesuai adalah 9952
Langkah kedua adalah membuka baris perintah dan menjalankan program JStack
Perhatikan bahwa jika variabel lingkungan tidak berhasil ditambahkan, itu hanya dapat dieksekusi di jalur JStack, jika tidak sistem operasi tidak akan mengenalinya.
Seperti yang ditunjukkan pada gambar, umumnya ada dua parameter operasi di sini, yang digunakan untuk mengambil snapshot memori.
Makna mereka adalah sebagai berikut:
-L daftar panjang akan mencetak informasi kunci tambahan. Saat kebuntuan terjadi, Anda dapat menggunakan JStack -L PID untuk mengamati situasi penahanan kunci
-M Mode Campuran, tidak hanya output informasi tumpukan java, tetapi juga output informasi tumpukan C/C ++ (seperti metode asli)
Kami biasanya menggunakan parameter -l untuk memenuhi kebutuhan
Formatnya adalah sebagai berikut JStack -L PID >> 123.txt
PS Catatan di sini >> berarti pengalihan, yang berarti mengeluarkan snapshot yang ditangkap ke 987.txt. >> Yang terbaik adalah menjaga spasi saat dua kali
Dengan cara ini, kami akan menghasilkan file 987.txt di jalur baris perintah dan menulis snapshot memori ke dalam teks ini secara bersamaan.
Seperti yang ditunjukkan pada gambar di bawah ini: