ในระหว่างการใช้ซอฟต์แวร์ Java บางครั้งปัญหาแปลก ๆ เกิดขึ้นอย่างลึกลับ ปัญหาเหล่านี้มักจะไม่สามารถอยู่ได้โดยใช้ข้อมูลบันทึก ในเวลานี้เราต้องวิเคราะห์ปัญหาโดยการตรวจสอบความสัมพันธ์ระหว่างสแต็กการโทรของเธรดภายในกระบวนการ
ตัวอย่างเช่นเมื่อเราทำการดำเนินการกล่องเตือนหลายกล่องจะปรากฏขึ้นอย่างลึกลับซึ่งบางส่วนเป็นเรื่องปกติและบางส่วนไม่ได้ สำหรับข้อความเตือนข้อผิดพลาดเหล่านี้เราควรค้นหารหัสที่ตำแหน่งใดที่มีกล่องป๊อปอัพข้อผิดพลาดได้อย่างไร เราจำเป็นต้องดูเธรดต่าง ๆ ของซอฟต์แวร์หลังจากกล่องป๊อปอัพและค้นหาว่าเธรดใดที่ทำให้เกิดปัญหา แต่บางครั้งเนื่องจากสภาพแวดล้อมเวลาและปัญหาอื่น ๆ เราไม่สามารถใช้ IDE เพื่อแก้ไขข้อบกพร่องได้ เราสามารถนำสแน็ปช็อตหน่วยความจำผ่านซอฟต์แวร์เครื่องมือแล้ววิเคราะห์ข้อมูลหน่วยความจำ
วันนี้ฉันแนะนำเครื่องมือที่ใช้กันทั่วไป: jstack
JSTACK เป็นเครื่องมือที่มาพร้อมกับ JDK และยังเป็นซอฟต์แวร์ที่มีอัตราการปรากฏตัวที่สูงมากในการปรับแต่งประสิทธิภาพ JVM ดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องเชี่ยวชาญ
JStack สามารถสร้างสแนปชอตเธรดของจุดปัจจุบันในเวลาของ JVM
สแน็ปช็อตเธรดเป็นชุดของเมธอดสแต็กที่แต่ละเธรดใน JVM ปัจจุบันกำลังดำเนินการ เหตุผลหลักในการสร้างสแน็ปช็อตเธรด:
1. เหตุผลสำหรับการหยุดเธรดระยะยาวผ่านสแน็ปช็อตเธรดเช่นการหยุดชะงักระหว่างเธรดลูปที่ตายแล้วและการรอคอยระยะยาวที่เกิดจากการขอทรัพยากรภายนอก
2. กำหนดแหล่งที่มาของข้อมูลข้อยกเว้นผ่านการวิเคราะห์สแน็ปช็อตเธรดของความสัมพันธ์การโทรของวิธีการดำเนินการปัจจุบัน
ใช้งานง่ายมาก:
(PS: หลักฐานคือคุณมี JDK กับ JStack อยู่แล้วมันเป็นการดีที่สุดที่จะมีชุดตัวแปรสภาพแวดล้อม)
ขั้นตอนที่ 1: ดู PID ของกระบวนการผ่าน Windows Task Manager
ที่นี่ฉันพูดสั้น ๆ ว่า PID คืออะไร: PID เป็นตัวตนของแต่ละกระบวนการ มันเป็นเอกลักษณ์เฉพาะที่กำหนดโดยระบบปฏิบัติการเพื่อระบุตัวตนของกระบวนการหลังจากเริ่มต้นซอฟต์แวร์
ดังที่แสดง
ใต้แท็บกระบวนการดู> เลือกคอลัมน์
ตรวจสอบ PID และยืนยัน
สลับไปที่แท็บแอปพลิเคชันและเลือกโปรแกรมเป็นหน่วยความจำ snapshot ภาพที่เลือกคือ Android Studio คลิกขวาที่จะไปดำเนินการ
ที่นี่เราจะเห็นว่า PID ที่สอดคล้องกันของ Android Studio คือ 9952
ขั้นตอนที่สองคือการเปิดบรรทัดคำสั่งและเรียกใช้โปรแกรม JStack
โปรดทราบว่าหากตัวแปรสภาพแวดล้อมไม่ได้เพิ่มสำเร็จก็สามารถดำเนินการได้ในเส้นทาง JSTACK มิฉะนั้นระบบปฏิบัติการจะไม่รู้จัก
ดังที่แสดงในรูปโดยทั่วไปจะมีพารามิเตอร์การทำงานสองพารามิเตอร์ที่นี่ซึ่งใช้ในการใช้สแน็ปช็อตหน่วยความจำ
ความหมายของพวกเขามีดังนี้:
-l Long Listings จะพิมพ์ข้อมูลการล็อคเพิ่มเติม เมื่อเกิดการหยุดชะงักคุณสามารถใช้ JSTACK -L PID เพื่อสังเกตสถานการณ์การถือล็อค
-m โหมดผสมไม่เพียง แต่ส่งออกข้อมูล Java Stack แต่ยังส่งออกข้อมูลสแต็ก C/C ++ (เช่นวิธีการดั้งเดิม)
เรามักจะใช้พารามิเตอร์ -L เพื่อตอบสนองความต้องการ
รูปแบบมีดังนี้ jstack -l pid >> 123.txt
PS หมายเหตุที่นี่ >> หมายถึงการเปลี่ยนเส้นทางซึ่งหมายถึงการส่งออกสแน็ปช็อตที่จับได้ถึง 987.txt >> เป็นการดีที่สุดที่จะรักษาช่องว่างเมื่อสองครั้ง
ด้วยวิธีนี้เราจะสร้างไฟล์ 987.txt ในเส้นทางบรรทัดคำสั่งและเขียนสแน็ปช็อตหน่วยความจำลงในข้อความนี้ในเวลาเดียวกัน
ดังที่แสดงในรูปด้านล่าง: