ฉันเพิ่งใช้ JStack เพื่อแก้ปัญหาการหยุดชะงักของกระบวนการ - อันที่จริงฉันได้แก้ไขมานานแล้วและฉันรู้เหตุผล แต่ฉันไม่พบที่ตั้งของการหยุดชะงักดังนั้นฉันจึงไม่เต็มใจที่จะทำเช่นนั้น
กระบวนการมีดังนี้:
(0) ข้อกำหนดด้านสิ่งแวดล้อม JDK 1.6 ขึ้นไป
(1) ก่อนอื่นให้ค้นหา PID ของกระบวนการ ใน Windows เปิดตัวจัดการกระบวนการและเรียงลำดับตามชื่อ คุณสามารถค้นหากระบวนการที่เรียกว่า javaw.exe (กระบวนการเครื่องเสมือน Java ทั้งหมดเรียกว่า javaw.exe) คุณต้องค้นหาว่ากระบวนการใดคือกระบวนการของคุณจำรายการกระบวนการปัจจุบันแล้วรีสตาร์ทกระบวนการของคุณ สิ่งที่ได้รับการรีเฟรชโดย PID คือกระบวนการของคุณ
(2) เรียกใช้ภายใต้ CMD: JSTACK PID, JSTACK จะพิมพ์ชุดข้อมูลบนคอนโซล
(3) วิเคราะห์ข้อมูลข้างต้น
ตัวอย่าง:
ข้อมูล jstack สำหรับคำถามของฉันมีดังนี้:
C:/เอกสารและการตั้งค่า/ผู้ใช้> JSTACK 66522012-06-07 21: 32: 02full Thread Dump Java Hotspot (TM) ไคลเอนต์ VM (16.3-B01 โหมดผสมการแชร์): "Thread-1" Daemon Prio = 6 TID = 0x03010C00 NID = 0xCD java.lang.thread.state: บล็อก (บนจอภาพวัตถุ) ที่ org.apache.commons.net.telnet.telnetinputstream .__ อ่าน (telnetinputstream.java:122) - รอล็อค <0x22294280> org.apache.commons.net.telnet.telnetinputstream.run (telnetinputstream.java:535) ที่ java.lang.thread.run (thread.java:619) "เฟรมเวิร์ก [0x0334f000] java.lang.thread.state: รอ (บนจอภาพวัตถุ) ที่ java.lang.object.wait (วิธีการดั้งเดิม) - รอ <0x228fa800> (a org.eclipse.osgi.framework.eventmgr.eventmane $ eventthread) org.eclipse.osgi.framework.eventmgr.eventManager $ eventthread.getNextEvent (EventManager.java:400) - ล็อค <0x228fa800> (a org.eclipse.osgi.framework.eventmgr.eventmanager org.eclipse.osgi.framework.eventmgr.eventManager $ eventthread.run (EventManager.java:336) "เริ่มต้นเหตุการณ์ระดับ" Daemon prio = 6 tid = 0x02fcf400 nid = 0x2638 ในวัตถุ java.lang.Object.wait (วิธีการดั้งเดิม) - รอ <0x2295db48> (a [i) ที่ java.lang.object.wait (Object.java:485) ที่ org.apache.commons.net.telnet.Telnetinputstream.read <0x2295db48> (a [i) ที่ org.apache.commons.net.telnet.telnetinputstream.read (telnetinputstream.java:466) ที่ java.io.bufferedinputstream.read1 java.io.bufferedInputStream.read (bufferedInputStream.java:317) - ล็อค <0x2295fe18> (a java.io.bufferedInputStream) ที่ sun.nio.cs.streamdecoder.readbytes sun.nio.cs.streamdecoder.implread (streamdecoder.java:306) ที่ sun.nio.cs.streamdecoder.read (streamdecoder.java:158) - ล็อค <0x22961f88> java.io.InputStreamReader.read (inputStreamReader.java:167) ที่ java.io.bufferedreader.fill (bufferedreader.java:136) ที่ java.io.bufferedreader.readline (bufferedreader.java:299) java.io.bufferedreader.readline (bufferedreader.java:362) ที่ org.apache.commons.net.ftp.ftp .__ getreply (ftp.java:264) ที่ org.apache.Commons.net.ftp.ftp._connectant_ (ftp. org.apache.commons.net.ftp.ftpclient._connectaction_ (ftpclient.java:550) ที่ org.apache.commons.net.socketclient.connect (SocketClient.java:163) ที่ com.mycompany.dc.ftp.client.ftpclientimpl.connect (ftpclientimpl.java:75) - ล็อค <0x229422280> (a org.apache.commons.net.ftp.ftpclient) ที่ com.mycompany.dc.ftp.client.ftpclientfactoryimpl.getClient (ftpclientfactoryimpl.java:35) - ล็อค <0x228f9310> (java.lang.object) org.eclipse.osgi.framework.internal.core.bundlecontextimpl $ 1.run (bundlecontextimpl.java:711) ที่ java.security.accesscontroller.doprivileged (วิธีการดั้งเดิม) ที่ org.eclipse.osgi.framework.internal.core.bundlecontextimpl.startactivator (bundlecontextimpl.java:702) ที่ org.eclipse.osgi.framework.internal.core.bundlecontextimpl.Start.Start org.eclipse.osgi.framework.internal.core.bundlehost.startworker (Bundlehost.java:381) ที่ org.eclipse.osgi.framework.internal.core.abstractbundle.resume org.eclipse.osgi.framework.internal.core.framework.resumebundle (framework.java:1131) ที่ org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles org.eclipse.osgi.framework.internal.core.startlevelmanager.resumeBundles (startlevelmanager.java:544) ที่ org.eclipse.osgi.framework.internal.core.startlevelmanager.incfwsl org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetstartlevel (startlevelmanager.java:243) - ล็อค <0x27e68d70> (java.lang.object) ที่ org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent (startlevelmanager.java:438) ที่ org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent org.eclipse.osgi.framework.eventmgr.eventmanager.dispatchevent (EventManager.java:230) ที่ org.eclipse.osgi.framework.eventmgr.eventManager $ eventthread.run (eventmanager.java:340) nid = 0x1fbc ใน object.wait () [0x0328f000] java.lang.thread.state: timed_waiting (บนจอมอนิเตอร์วัตถุ) ที่ java.lang.object.wait (วิธีการดั้งเดิม) - รอ <0x27e65770> org.eclipse.osgi.framework.internal.core.framework.run (framework.java:1817) - ล็อค <0x27e65770> (a org.eclipse.osgi.framework.internal.core.framework) java.lang.thread.run (thread.java:619) "Osgi console" prio = 6 tid = 0x03005400 nid = 0x225c รอเงื่อนไข [0x0323f000] java.lang.thread.state: timed_waiting org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole (frameworkconsole.java:125) ที่ org.eclipse.osgi.framework.internal.core.frameworkconsole.run java.lang.thread.run (thread.java:619) "เครื่องตรวจจับหน่วยความจำต่ำ" daemon prio = 6 tid = 0x02c09800 nid = 0x1d68 runnable [0x000000000] java.lang.thread.state บนเงื่อนไข [0x000000000] java.lang.thread.state: Runnable "Attach Listener" Daemon Prio = 10 TID = 0x02C01800 NID = 0x1138 รอเงื่อนไข [0x000000000] Java.lang.Thread.Tate [0x000000000] java.lang.thread.state: runnable "finalizer" daemon prio = 8 tid = 0x02bc0400 nid = 0x11ac ใน object.wait () [0x02d8f000] java.lang.thread.state: รอ <0x27d5e5c8> (a java.lang.ref.referencequeue $ lock) ที่ java.lang.ref.referencequeue.remove (referencequeue.java:118) - ล็อค <0x27d5e5c8> java.lang.ref.referencequeue.remove (ReferenceQueue.java:134) ที่ java.lang.ref.finalizer $ finalizerThread.run (finalizer.java:159) java.lang.thread.state: รอ (บนจอภาพวัตถุ) ที่ java.lang.object.wait (วิธีการดั้งเดิม) - รอ <0x27d5e650> (java.lang.ref.reference $ lock) ที่ java.lang.object.wait java.lang.ref.reference $ referienceHandler.run (referience.java:116) - ล็อค <0x27d5e650> (a java.lang.ref.reference $ lock) "main" prio = 6 tid = 0x008a6c00 nid = 0x22ec ในวัตถุ timed_waiting (บนจอภาพวัตถุ) ที่ java.lang.object.wait (วิธีการดั้งเดิม) - รอ <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) ที่ org.eclipse.core.runtime.internal ล็อค <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) ที่ org.eclipse.core.runtime.adaptor.eclipsestarter.updatesplash (eclipsestarter.java:1251) org.eclipse.core.runtime.adaptor.eclipsestarter.setstartlevel (eclipsestarter.java:1213) ที่ org.eclipse.core.runtime.adaptor.eclipsestarter.startup (eclipsestarter.java:288 org.eclipse.core.runtime.adaptor.eclipsestarter.run (eclipsestarter.java:175) ที่ sun.reflect.nativemethodaccessorimpl.invoke0 sun.reflect.delegatingMethodaccessorimpl.invoke (มอบหมาย Methodaccessorimpl.java:25) ที่ java.lang.reflect.method.invoke (method.java:597) ที่ org.eclipse.equinox.launcher.main. org.eclipse.equinox.launcher.main.basicrun (main.java:577) ที่ org.eclipse.equinox.launcher.main.run (main.java:1410) ที่ org.eclipse.equinox.launcher.main.main.main.main.main.main tid = 0x02bba000 nid = 0xdb4 runnable "vm task task task task task" prio = 10 tid = 0x02c0e400 nid = 0x24ac รอเงื่อนไขการอ้างอิงทั่วโลก: 677
วิเคราะห์:
ตามพรอมต์เธรดทั้งสองใช้วัตถุ FTPClient เป็นล็อคและผู้ที่ได้รับการล็อคก่อนหน้านี้จะต้องรอให้คนต่อไปต้องการผลตอบแทนของการล็อคทำให้เกิดการหยุดชะงัก สถานที่ทั้งสองนี้คือ:
(1) ที่ org.apache.commons.net.telnet.telnetinputstream .__ อ่าน (telnetinputstr
eam.java:122)
(2) - ล็อค <0x22942280> (a org.apache.commons.net.ftp.ftpclient)
ที่ com.sagemcom.dc.ftp.client.ftpclientfactoryimpl.getClient (ftpclientfa
ctoryimpl.java:35)
- ล็อค <0x228f9310> (a java.lang.Object)
อดีตคือล็อคที่ใช้โดยระบบเองและส่วนหลังจะถูกเพิ่มในรหัสของฉัน มันจะได้รับการแก้ไขโดยการเปลี่ยนวัตถุในรหัสของคุณเองเพื่อล็อค
สรุป
JStack ค่อนข้างมีประโยชน์ในการแก้ปัญหา ข้อมูลมีความกระชับและมีประสิทธิภาพ ในความเป็นจริงมีเครื่องมือวิเคราะห์กราฟิกมากมายตาม อย่างไรก็ตาม JSTACK จะต้องได้รับการสนับสนุนโดย JDK1.6 หรือสูงกว่า
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการแก้ปัญหาการหยุดชะงักของกระบวนการผ่านการวิเคราะห์ JStack ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!