JSTACK ใช้เพื่อพิมพ์ข้อมูล Java Stack ของรหัสกระบวนการ Java ที่กำหนดหรือไฟล์หลักหรือบริการดีบั๊กระยะไกล หากอยู่ในเครื่อง 64 บิตคุณจะต้องระบุตัวเลือก "-J-D64" การใช้ Windows JStack รองรับวิธีการต่อไปนี้เท่านั้น:
jstack [-l] [f] pid
หากโปรแกรม Java ขัดข้องในการสร้างไฟล์หลักเครื่องมือ JSTACK สามารถใช้เพื่อรับข้อมูลเกี่ยวกับ Java Stack และสแต็กดั้งเดิมของไฟล์หลักเพื่อให้คุณสามารถรู้ได้อย่างง่ายดายว่าโปรแกรม Java ล่มและโปรแกรมที่เป็นปัญหาอย่างไร นอกจากนี้เครื่องมือ JSTACK ยังสามารถแนบกับโปรแกรม Java Running และดูข้อมูลเกี่ยวกับ Java Stack และ Native Stack ของโปรแกรม Java ที่ทำงานในเวลานั้น หากโปรแกรม Java ที่กำลังดำเนินอยู่ในขณะนี้แสดงสถานะ Hung แล้ว JStack มีประโยชน์มาก หากกระบวนการอยู่ในสภาพตายของ Hung คุณสามารถบังคับให้สแต็คเล่นกับ -F
ในไฟล์ Dump สถานะเธรดที่ควรค่าแก่การให้ความสนใจคือ:
การหยุดชะงักการหยุดชะงัก (มุ่งเน้น)
ที่รันได้
รอเงื่อนไข (มุ่งเน้น)
กำลังรอการเข้าชมการตรวจสอบ (มุ่งเน้น)
ถูกระงับ
การรอวัตถุ, object.wait () หรือ timed_waiting
ถูกบล็อกบล็อก (มุ่งเน้น)
หยุดจอดรถ
ฉันดูสามสถานการณ์จากบล็อกอื่น:
ตัวอย่างที่ 1: รอล็อคและบล็อก
"การเชื่อมต่อ RMI TCP (267865) -172.16.5.25" daemon prio = 10 tid = 0x00007fd508371000 nid = 0x55ae รอรายการจอภาพ [0x000007fd4f8684000] java.lang.thread org.apache.log4j.category.callappenders (category.java:201)- รอล็อค <0x000000acf4d0c0> (a org.apache.log4j.logger) ที่ org.apache.log4j.category.forcedlog org.apache.log4j.category.log (category.java:853) ที่ org.apache.commons.logging.impl.log4jlogger.warn (log4jlogger.java:234) ที่ com.tuan.core.common.lang.cache.remote.spymemcachedclient.get (spymemcachedclient.java:110)
ภาพประกอบ:
1) สถานะเธรดถูกบล็อกบล็อก หมายความว่าเธรดรอให้ทรัพยากรหมดเวลา!
2) "รอล็อค <0x00000000acf4d0c0>" หมายความว่าเธรดกำลังรอที่จะล็อคที่อยู่ 0x00000000acf4d0c0 (สามารถอธิบายได้เป็นภาษาอังกฤษเป็น: พยายามรับ 0x000000000000acf4d0c0)
3) ค้นหาสตริง 0x00000000ACF4D0C0 ในบันทึกการถ่ายโอนข้อมูลและพบว่ามีเธรดจำนวนมากรอล็อคที่อยู่นี้ หากคุณสามารถค้นหาว่าใครได้รับการล็อคนี้ในบันทึก (เช่นล็อค <0x000000acf4d0c0>) คุณสามารถติดตามเบาะแสได้
4) "การรอการป้อนข้อมูลการตรวจสอบ" หมายความว่าเธรดนี้เข้าสู่พื้นที่วิกฤตผ่านแอปพลิเคชันที่ซิงโครไนซ์ (OBJ) {... } ดังนั้นจึงเข้าสู่คิว "ชุดรายการ" ในรูปที่ 1 ด้านล่าง อย่างไรก็ตามจอภาพที่สอดคล้องกับ OBJ นั้นเป็นของเธรดอื่นดังนั้นเธรดนี้จึงรออยู่ในคิวชุดรายการ
5) ในบรรทัดแรก "การเชื่อมต่อ RMI TCP (267865) -172.16.5.25" เป็นชื่อเธรด TID หมายถึงรหัสเธรด Java NID หมายถึง ID ของเธรดดั้งเดิม PRIO เป็นลำดับความสำคัญของเธรด [0x00007FD4F8684000] เป็นที่อยู่เริ่มต้นสแต็ก
ตัวอย่างที่ 2: รอเงื่อนไขและ timed_waiting
"การเชื่อมต่อ RMI TCP (ไม่ได้ใช้งาน)" Daemon Prio = 10 TID = 0x00007FD50834E800 NID = 0x56b2 รอเงื่อนไข [0x000007FD4F1A59000] Java.lang.Thread.state: timed_waiting <0x00000000ACD84DE8> (a java.util.concurrent.synchronousqueue $ transferstack) ที่ java.util.concurrent.locks.locksupport.parknanos (locksupport.java:198) ที่ java.util.concurrent.synchronousqueue $ transferstack.awaitfulfill (synchronousqueue.java:424) ที่ java.util.concurrent.synchronousqueue $ transferstack.transfer (synchronousqueue.java:323) java.util.concurrent.synchronousqueue.poll (synchronousqueue.java:874) ที่ java.util.concurrent.threadpoolexecutor.getTask (Threadpoolexecutor.java:945) ที่ java.util.concurrent.threadpoolexecutor $ worker.run (threadpoolexecutor.java:907) ที่ java.lang.thread.run (thread.java:662)
ภาพประกอบ:
1) timed_waiting ใน "timed_waiting (ที่จอดรถ)" หมายถึงสถานะการรอคอย แต่เวลาที่ระบุไว้ที่นี่และสถานะการรอคอยจะออกโดยอัตโนมัติหลังจากถึงเวลาที่กำหนด; ที่จอดรถหมายถึงเธรดที่ถูกระงับ
2) "รอเงื่อนไข" จะต้องรวมกับ "ที่จอดรถเพื่อรอ <0x000000acd84de8> (a java.util.concurrent.synchronousqueue $ transferstack)" ในสแต็ก ก่อนอื่นกระทู้นี้กำลังรอเงื่อนไขที่แน่นอนที่จะปลุกตัวเอง ประการที่สอง Synchronousqueue ไม่ใช่คิวมันเป็นเพียงกลไกในการส่งข้อมูลระหว่างเธรด เมื่อเราใส่องค์ประกอบลงใน Synchronousqueue จะต้องมีเธรดอื่นที่รอให้งานส่งมอบดังนั้นนี่คือเงื่อนไขที่เธรดนี้กำลังรออยู่
3) ฉันมองไม่เห็นอะไรอีก
ตัวอย่างที่ 3: ใน obejct.wait () และ timed_waiting
"RMI Renewclean- [172.16.5.19:28475]" daemon prio = 10 tid = 0x00000041428800 nid = 0xb09 ใน object.wait () [0x00007f34f4bd0000] java.lang วิธีการ)- รอ <0x00000000aa672478> (a java.lang.ref.referencequeue $ lock) ที่ java.lang.ref.referencequeue.remove (ReferenceQueue.java:118)- Locked <0x00000000aa672478 sun.rmi.transport.dgcclient $ endpointentry $ rebusecleanthread.run (dgcclient.java:516) ที่ java.lang.thread.run (thread.java:662)
ภาพประกอบ:
1) "timed_waiting (บนจอภาพวัตถุ)" สำหรับตัวอย่างนี้เป็นเพราะเธรดนี้เรียก java.lang.object.wait (การหมดเวลานาน) และเข้าสู่สถานะการรอคอย
2) สถานะเธรดรอใน "ชุดรอ" คือ "ใน Object.wait ()" เมื่อเธรดได้รับการตรวจสอบและเข้าสู่ส่วนที่สำคัญหากพบว่าเธรดยังคงทำงานต่อไปจะไม่ตรงกับวิธีการรอ () ของวัตถุ (โดยปกติจะเป็นวัตถุที่ซิงโครไนซ์) abandons จอภาพและเข้าสู่คิว "รอชุดรอ" เฉพาะเมื่อเธรดอื่นโทรแจ้งให้ทราบ () หรือแจ้งเตือน () บนวัตถุเธรดในคิว "รอชุด" จะได้รับโอกาสในการแข่งขัน แต่มีเพียงเธรดเดียวเท่านั้นที่ได้รับการตรวจสอบของวัตถุและกลับสู่สถานะการทำงาน
3) RMI Renewclean เป็นส่วนหนึ่งของ DGCClient DGC หมายถึงการกระจาย GC นั่นคือการรวบรวมขยะแจกจ่าย
4) โปรดทราบว่ามันถูกล็อคครั้งแรก <0x0000000AA672478> จากนั้นรอ <0x0000000AA672478> เหตุผลในการล็อคก่อนแล้วจึงเท่ากับวัตถุเดียวกันคือการดูการใช้งานรหัสด้านล่าง:
ล็อคคลาสส่วนตัวแบบคงที่ {}; ล็อคส่วนตัว = ล็อคใหม่ (); การอ้างอิงสาธารณะ <? ขยาย t> ลบ (การหมดเวลายาว) {ซิงโครไนซ์ (ล็อค) {อ้างอิง <? ขยาย t> r = จริง ๆ (); ถ้า (r! = null) return r; สำหรับ (;;) {lock.wait (หมดเวลา); r = จริง ๆ (); -นั่นคือในระหว่างการดำเนินการของเธรดจอภาพของวัตถุนี้จะได้รับด้วยการซิงโครไนซ์ก่อน (สอดคล้องกับล็อค <0x0000000AA672478>); เมื่อดำเนินการไปยัง lock.wait (หมดเวลา); เธรดละทิ้งความเป็นเจ้าของของจอภาพและเข้าสู่คิว "Wait Set" (สอดคล้องกับการรอ <0x000000aa672478>)
5) การตัดสินจากข้อมูลสแต็กการอ้างอิงระยะไกลไปยังวัตถุระยะไกลกำลังถูกทำความสะอาด สัญญาเช่าที่อ้างอิงได้มาถึงแล้วและการรวบรวมขยะแจกจ่ายกำลังทำความสะอาดทีละคน
อ้างอิง:
แก้ไขปัญหาการหยุดชะงักของกระบวนการผ่านรหัสตัวอย่างการวิเคราะห์ JSTACK
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการวิเคราะห์และสถานการณ์การใช้งานของเครื่องมือวิเคราะห์การถ่ายโอนข้อมูล Java jstack ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!