ฉันใช้kill -3
คำสั่งเพื่อดูเธรดดัมพ์ของ JVM ในยูนิกซ์ แต่ฉันจะหาผลลัพธ์ของkill
คำสั่งนี้ได้ที่ไหน? ฉันหลงทาง!!
ฉันใช้kill -3
คำสั่งเพื่อดูเธรดดัมพ์ของ JVM ในยูนิกซ์ แต่ฉันจะหาผลลัพธ์ของkill
คำสั่งนี้ได้ที่ไหน? ฉันหลงทาง!!
คำตอบ:
คุณสามารถใช้ jstack (รวมกับ JDK) เพื่อถ่ายโอนข้อมูลเธรดและเขียนเอาต์พุตได้ทุกที่ที่คุณต้องการ สิ่งนั้นไม่พร้อมใช้งานในสภาพแวดล้อม Unix หรือไม่?
jstack PID > outfile
เธรดดัมพ์ถูกเขียนไปยังระบบจาก VM ที่คุณรันไฟล์kill -3
. หากคุณกำลังเปลี่ยนทิศทางเอาต์พุตคอนโซลของ JVM ไปยังไฟล์เธรดดัมพ์จะอยู่ในไฟล์นั้น หาก JVM กำลังทำงานในคอนโซลแบบเปิดเธรดดัมพ์จะแสดงในคอนโซล
มีวิธีเปลี่ยนเส้นทางเอาต์พุตการถ่ายโอนข้อมูลเธรด JVM บนสัญญาณแบ่งไปยังไฟล์แยกด้วยตัวเลือกการวินิจฉัย LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
ด้วย Java 8 ในภาพjcmd
เป็นแนวทางที่ต้องการ
jcmd <PID> Thread.print
ต่อไปนี้เป็นตัวอย่างจากเอกสาร Oracle :
JDK 8 เปิดตัว Java Mission Control, Java Flight Recorder และยูทิลิตี้ jcmd สำหรับการวินิจฉัยปัญหาเกี่ยวกับแอปพลิเคชัน JVM และ Java ขอแนะนำให้ใช้ยูทิลิตี้ล่าสุด jcmd แทนยูทิลิตี้ jstack ก่อนหน้านี้เพื่อการวินิจฉัยขั้นสูงและลดค่าใช้จ่ายด้านประสิทธิภาพ
อย่างไรก็ตามการจัดส่งสิ่งนี้พร้อมกับแอปพลิเคชันอาจมีผลกระทบต่อการออกใบอนุญาตซึ่งฉันไม่แน่ใจ
jcmd
ล้มเหลวในการเชื่อมต่อกับกระบวนการบริการของ windows com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
ในขณะที่jstack -F
ประสบความสำเร็จ: stackoverflow.com/questions/1197912/…
ในตำแหน่งเดียวกับที่วาง stdout ของ JVM หากคุณมีเซิร์ฟเวอร์ Tomcat นี่จะเป็นcatalina_(date).out
ไฟล์
เมื่อใช้ kill -3 ควรเห็นเธรดดัมพ์ในเอาต์พุตมาตรฐาน แอ็พพลิเคชันเซิร์ฟเวอร์ส่วนใหญ่เขียนเอาต์พุตมาตรฐานไปยังไฟล์แยกต่างหาก คุณควรจะพบมันเมื่อใช้ kill -3 มีหลายวิธีในการทิ้งเธรด:
kill -3 <PID>
: ให้เอาต์พุตเป็นเอาต์พุตมาตรฐานสำหรับฮอตสปอต VM เรายังสามารถใช้jstack
คำสั่งเพื่อสร้างเธรดดัมพ์ มันเป็นส่วนหนึ่งของ JDK ไวยากรณ์มีดังนี้:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
ควรฆ่า JVM คุณกำลังดูแอป Java ประเภทใด
ใน Jboss คุณสามารถดำเนินการดังต่อไปนี้
nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
kill -3 <java_pid>
การดำเนินการนี้จะเปลี่ยนเส้นทางเอาต์พุต / threadump ของคุณไปยังคอนโซลไฟล์ที่ระบุในคำสั่งด้านบน
ขั้นตอนที่คุณควรปฏิบัติตามหากคุณต้องการให้เธรดดัมพ์ของกระบวนการ Java แบบสแตนด์อโลนของคุณ
ขั้นตอนที่ 1:รับ ID กระบวนการสำหรับเชลล์สคริปต์ที่เรียกโปรแกรม java
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
ขั้นตอนที่ 2:รับ ID กระบวนการสำหรับเด็กที่ runABCD เรียกใช้ ใช้ PID ด้านบนเพื่อรับลูก
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
ขั้นตอนที่ 3:รับ JSTACK สำหรับกระบวนการเฉพาะ รับรหัสกระบวนการของกระบวนการ XYSServer ของคุณ เช่น 8536
linux$ jstack **8536** > threadDump.log