يتم استخدام JSTACK لطباعة معلومات مكدس Java لمعرف عملية Java معين أو ملف أساسي أو خدمة تصحيح الأخطاء عن بُعد. إذا كان على جهاز 64 بت ، فأنت بحاجة إلى تحديد الخيار "-J-D64". يدعم استخدام Windows JStack فقط الطرق التالية:
JSTACK [-L] [F] PID
إذا تعطل برنامج Java لإنشاء ملف أساسي ، فيمكن استخدام أداة JSTACK للحصول على معلومات حول مكدس Java والمكدس الأصلي للملف الأساسي ، بحيث يمكنك بسهولة معرفة كيفية تعطل برنامج Java وحيث يكون البرنامج مشكلة. بالإضافة إلى ذلك ، يمكن أيضًا إرفاق أداة JSTACK ببرنامج Running Java ومعرفة المعلومات حول Java Stack و Native Stack of Java التي كانت تعمل في ذلك الوقت. إذا كان برنامج Java قيد التشغيل الآن يجعل حالة Hung ، فإن JStack مفيد جدًا. إذا كانت العملية في حالة معلقة ، فيمكنك إجبار المكدس على لعبها مع -F.
في ملف التفريغ ، فإن حالة الموضوع تستحق الاهتمام بها هي:
Deadlock ، deadlock (التركيز على)
Runnable
الانتظار بشرط (ركز على)
في انتظار دخول الشاشة (التركيز على)
معلق
كائن انتظار ، object.wait () أو timed_waiting
محظور ، حظر (مركزة)
توقف ، متوقفة
ألقيت نظرة على ثلاثة سيناريوهات من مدونة أخرى:
مثال 1: في انتظار قفل وحظر
"اتصال RMI TCP (267865) -172.16.5.25" Daemon Prio = 10 Tid = 0x00007FD508371000 NID = 0x55AE في انتظار إدخال الشاشة [0x000007FD4F8684000] org.apache.log4j.category.callappenders (category.java:201)- في انتظار قفل <0x0000000000acf4d0c0> (a org.apache.log4j.logger) على org.apache.log4j.category.forcedlog org.apache.log4j.category.log (الفئة. com.tuan.core.common.lang.cache.remote.spymemcachedclient.get (spymcachedclient.java:110)
يوضح:
1) تم حظر حالة الخيط ، محظورة. وهذا يعني أن الخيط ينتظر المورد إلى الوقت!
2) "انتظار القفل <0x00000000000000c0c0>" يعني أن الخيط ينتظر قفل عنوان 0x000000000000CF4D0C0 (يمكن وصفه باللغة الإنجليزية على النحو التالي: محاولة الحصول على 0x000000000000cf4d0c0).
3) ابحث عن السلسلة 0x000000000000cf4d0c0 في سجل التفريغ ووجد أن هناك عددًا كبيرًا من مؤشرات الترابط في انتظار قفل هذا العنوان. إذا تمكنت من العثور على من حصل على هذا القفل في السجل (مثل Locked <0x0000000000acf4d0c0>) ، فيمكنك متابعة القرائن.
4) "انتظار إدخال الشاشة" يعني أن هذا الموضوع يدخل المنطقة الحرجة من خلال تطبيق متزامن (OBJ) {...} ، وبالتالي إدخال قائمة انتظار "مجموعة الإدخال" في الشكل 1 أدناه. ومع ذلك ، فإن الشاشة المقابلة لـ OBJ مملوكة لخيوط أخرى ، لذلك ينتظر هذا الموضوع في قائمة انتظار مجموعة الإدخال.
5) في السطر الأول ، "اتصال RMI TCP (267865) -172.16.5.25" هو اسم مؤشر الترابط. المد والجزر يشير إلى معرف موضوع Java. يشير NID إلى معرف الخيط الأصلي. بريو هو أولوية الموضوع. [0x00007FD4F8684000] هو عنوان بدء مكدس مؤشر الترابط.
مثال 2: الانتظار على الحالة وتوقيت _waiting
"RMI TCP Connection (IDLE)" Daemon Prio = 10 tid = 0x00007fd50834e800 nid = 0x56b2 الانتظار على الحالة [0x000007fd4f1a59000] java.lang.thread.state <0x0000000000acd84de8> (a java.util.concurrent.synchronousqueue $ transferstack) على java.util.concurrent.locks.locksupport.parknanos (locksupport.java:198) على java.util.concurrent.synchronousqueue $ transferstack.awaitfulfill 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) يجب دمج "الانتظار على الشرط" مع "وقوف السيارات لانتظار <0x0000000000ACD84DE8> (a java.util.concurrent.synchronousqueue $ transferstack)" في المكدس. بادئ ذي بدء ، هذا الموضوع ينتظر بالتأكيد حالة معينة لتستيقظ نفسه. ثانياً ، Synchronousqueue ليس قائمة انتظار ، إنها مجرد آلية لتسليم المعلومات بين المواضيع. عندما نضع عنصرًا في متزامن ، يجب أن يكون هناك مؤشر ترابط آخر في انتظار تسليم المهمة ، لذلك هذا هو الشرط الذي ينتظره هذا الموضوع.
3) لا أستطيع رؤية أي شيء آخر.
مثال 3: في obejct.wait () و timed_waiting
"RMI RenewClean- [172.16.5.19:28475]" Daemon prio = 10 tid = 0x0000000041428800 nid = 0xb09 in Object.Wait () [0x00007f34f4bd0000] الطريقة)- الانتظار على <0x00000000aa672478> (a java.lang.ref.referencequeue $ lock) في java.lang.ref.referencequeue.remove (java.java:118)- مغلق <0x000000aa672478> sun.rmi.transport.dgcclient $ endpointry $ renewCleAnthread.run (dgcclient.java:516) at java.lang.thread.run (thread.java:662)
يوضح:
1) "timed_waiting (على مراقبة الكائن)" لهذا المثال ، فذلك لأن هذا الموضوع يستدعي java.lang.object.wait (فترة طويلة) ويدخل حالة الانتظار.
2) حالة مؤشر ترابط الانتظار في "مجموعة الانتظار" هي "في object.wait ()". عندما يحصل مؤشر الترابط على الشاشة ويدخل القسم الحرج ، إذا وجد أن مؤشر الترابط لا يتم تشغيله ، فإنه يستدعي طريقة WAIT () للكائن (عادةً ما يتم مزامنة الكائن) ، يتخلى عن الشاشة ، ويدخل قائمة انتظار "مجموعة الانتظار". فقط عندما تتصل مؤشرات الترابط الأخرى بـ () أو إخطار () على الكائن ، تحصل مؤشرات الترابط في قائمة انتظار "Wait Set" على الفرصة للتنافس ، لكن مؤشر ترابط واحد فقط يحصل على شاشة الكائن والعودة إلى حالة التشغيل.
3) RMI Renewclean جزء من DGCCLIENT. يشير DGC إلى GC الموزعة ، أي مجموعة القمامة الموزعة.
4) يرجى ملاحظة أنه تم قفله أولاً <0x0000000aa672478> ثم ينتظر على <0x0000000aa672478>. سبب القفل أولاً ثم معادل نفس الكائن هو رؤية تنفيذ الكود أدناه:
قفل فئة خاص ثابت {} ؛ قفل خاص = جديد القفل () ؛ مرجع عام <؟ يمتد t> إزالة (timeout long) {synchronized (lock) {Reference <؟ يمتد t> r = حقا poll () ؛ إذا (r! = null) return r ؛ لـ (؛؛) {lock.wait (timeout) ؛ r = حقا poll () ؛ ...}}وهذا هو ، أثناء تنفيذ مؤشر الترابط ، يتم الحصول على شاشة هذا الكائن باستخدام متزامن أولاً (المقابلة لـ Locked <0x0000000aa672478>) ؛ عند تنفيذها على lock.wait (timeout) ؛ ، يتخلى الخيط عن ملكية الشاشة ويدخل قائمة انتظار "مجموعة الانتظار" (المقابلة للانتظار على <0x00000000aa672478>).
5) انطلاقًا من معلومات المكدس ، يتم تنظيف المراجع عن بُعد إلى الكائنات البعيدة. وصل عقد الإيجار المرجعية ، وجمع القمامة الموزعة يقوم بتنظيف واحد تلو الآخر.
مرجع:
حل مشكلة deadlock من خلال تحليل مثال تحليل JSTACK
لخص
ما ورد أعلاه هو كل شيء عن التحليل والاستخدام سيناريوهات أداة تحليل تفريغ مؤشر ترابط Java JSTACK ، آمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!