لقد استخدمت JSTACK للتو لحل مشكلة عملية إزالة الجمود العملية - في الواقع ، لقد حللتها منذ وقت طويل ، وأنا أعلم السبب ، لكنني لم أجد موقع Deadlock ، لذلك لست على استعداد للغاية للقيام بذلك.
العملية تقريبًا على النحو التالي:
(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) Client VM (16.3-B01 MINGED MODE ، Sharing): "Thread-1" Daemon Prio = 6 Tid = 0x03010C00 Nid = 0xcdc Ewark java.lang.thread.state: محظور (على مراقبة الكائن) في org.apache.commons.net.telnet.telnetinputstream .__ قراءة (telnetinputstream.java:122) - في انتظار قفل <0x22942280> (a org.apache.commons.nt 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.eventmanager $) at java في org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.getNextevent org.eclipse.osgi.framework.eventMgr.EventManager $ eventThread.Run (eventManager.java:336) في java.lang.object.wait (الطريقة الأصلية) - الانتظار على <0x2295db48> (a [i) في java.lang.object.wait (object.java:485) على org.apache.commons.net.telnet.telnetinputstreept. <0x2295db48> (a [i) at org.apache.commons.net.telnet.telnetinputstream.read (telnetinputstream.java:466) في java.io.buffefudedinputstream.read1 java.io.bufferedinputstream.read (bufferedInputStream.java:317) - مغلق <0x2295fe18> (java.io.bufferedinputstream) في sun.nio.cs.streamdecoder.readbytes (StreamDecoder.java:264) at sun.nio.cs.streamdecoder.implread (StreamDecoder.java:306) في sun.nio.cs.streamdecoder.read (java.io.inptstreamer) - مغلق <0x22961f88> (a java.io.inputstreamer) java.io.inputstreamreader.read (inpectStreamReader.java:167) في java.io.bufferedreader.fill (bufferedreader.java:136) على java.io.buffefudreadreader.readline (bufferedreader.java:29) - java.io.inputstreamreader) في java.io.bufferedreader.readline (bufferedreader.java:362) at org.apache.commons.net.ftp.ftp .__ getReply (ftp.java:264) على org.apache.commons.net.ftp.ftp._connectaction_ (ftp.java:335) في org.apache.commons.net.ftp.ftpclient._connectactaction_ (ftpclient.java:550) في org.apache.commons.net.socket.connect. com.mycompany.dc.ftp.client.ftpclientimpl.connect (ftpclientimpl.java:75) - مغلق <0x22942280> (a org.apache.commons.net.ftp.ftpclient) في com.mycompany.dc.ftp.client.ftpclientfactoryimpl.getClient (ftpclientfactoryimpl.java:35) - Locked <0x228f9310> 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) at org.eclipse.osgi org.eclipse.osgi.framework.internal.core.bundlehost.startworker (bundlehost.java:381) at org.eclipse.osgi.framework.internal.core.abstractbun.resume (ussctbundle.java:389) at org.eclipse.osgi.framework.internal.core.framework.resumeBundle (Framework.java:1131) at org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles ( org.eclipse.osgi.framework.internal.core.startlevelmanager.resumeBundles (strenlevelmanager.java:544) في org.eclipse.osgi.framework.internal.core.startlevelmanager.incfwsl org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetstartlevel (strenlevelmanager.java:243) - مغلق <0x27e68d70> (a java.lang.object) على org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent (strenlevelmanager.java:438) في org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchevent (startLevelmanagermanager.1) in org.eclipse.osgi.framework.eventmgr.eventManager.dispatchevent (eventManager.java:230) at 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> (a org.eclipsegi org.eclipse.osgi.framework.internal.core.framework.run (Framework.java:1817) - Locked <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 org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole (FrameworkConsole.java:125) at 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 الشرط [0x00000000000] java.lang.thread.state: Runnable "إرفاق المستمع" Daemon Prio = 10 tid = 0x02c01800 nid = 0x1138 في انتظار الحالة [0x000000000] java.lang.thread.state [0x000000000] java.lang.thread.state: Runnable "Finalizer" Daemon Prio = 8 tid = 0x02bc0400 nid = 0x11ac in object.wait () [0x02d8f000] <0x27d5e5c8> (a java.lang.ref.referencequeue $ lock) في java.lang.ref.referencequeue.remove (java.java java.lang.ref.referencequeue.remove (referencequeue.java:134) في java.lang.ref.finalizer $ finalizerThread.Run (finalizer.java:159) "مرجع المعالج" Daemon Prio = 10 Tid = 0x02B800 nid = 0x9cc java.lang.thread.state: الانتظار (على مراقبة الكائن) في java.lang.object.wait (الطريقة الأصلية) - الانتظار في <0x27d5e650> (a java.lang.ref.reference $ lock) على java.lang.object.wait (objec.java:485) at java.lang.ref.reference $ reversehandler.run (reference.java:116) - locked <0x27d5e650> (a java.lang.ref.reference $ lock) "main" prio = 6 tid = 0x008A6C00 timed_waiting (على مراقبة الكائن) على java.lang.object.wait (الطريقة الأصلية) - الانتظار على <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) على org.eclipse.core.runtime.inal.adapptor.sepapt مغلق <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 (DevatingMethodAccessorImpl.Java:25) في java.lang.reflect.method.invoke (method.java:597) في org.eclipse.equinox.launcher.main.invokewore org.eclipse.equinox.launcher.main.basicrun (main.java:577) at org.eclipse.equinox.launcher.main.run tid = 0x02bba000 nid = 0xdb4 Runnable "VM Deurale Task Thread" Prio = 10 Tid = 0x02C0E400 NID = 0x24AC في انتظار inctionjni Global References: 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 أو أعلى.
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة حول حل مشكلات Deadlock من خلال تحليل JSTACK. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!