أثناء استخدام برنامج Java ، تنشأ مشاكل غريبة في بعض الأحيان بشكل غير مفهوم. غالبًا ما لا يمكن تحديد هذه المشكلات باستخدام معلومات السجل. في هذا الوقت ، نحتاج إلى تحليل المشكلة عن طريق التحقق من علاقة مكالمة المكدس من مؤشرات الترابط داخل العملية.
على سبيل المثال ، عندما نقوم بعملية ما ، ستظهر صناديق تحذير متعددة بشكل غير مفهوم ، وبعضها طبيعي وبعضها ليس كذلك. بالنسبة لرسائل تحذير الأخطاء هذه ، كيف يجب أن نحدد موقع الرمز في أي موقع لديه مربع منبثق خطأ؟ نحتاج إلى عرض مؤشرات الترابط المختلفة للبرنامج بعد مربع المنبثقة ومعرفة الخيط الذي يسبب المشكلة. ولكن في بعض الأحيان بسبب البيئة والوقت والقضايا الأخرى ، لا يمكننا استخدام IDE للتصحيح. يمكننا فقط أخذ لقطة ذاكرة من خلال برنامج الأدوات ثم تحليل معلومات الذاكرة.
اليوم أقدم أداة شائعة الاستخدام: JSTACK
JSTACK هي أداة تأتي مع JDK وهي أيضًا برنامج ذو معدل ظهور مرتفع للغاية في ضبط أداء JVM. لذلك من الضروري جدا إتقانه.
يمكن لـ JSTACK إنشاء لقطات مؤشر ترابط للنقطة الحالية في وقت JVM.
لقطة مؤشر ترابط هي مجموعة من مداخن الأسلوب التي ينفذها كل مؤشر ترابط في JVM الحالي. الأسباب الرئيسية لإنشاء لقطات الخيط:
1. سبب توقف التوقف طويل الأجل للخيوط من خلال لقطات الخيط ، مثل الجمود بين المواضيع والحلقات الميتة والانتظار طويل الأجل بسبب طلب الموارد الخارجية.
2. تحديد مصدر معلومات الاستثناء من خلال تحليل لقطة مؤشر ترابط لعلاقة الاتصال لطريقة التنفيذ الحالية.
إنه سهل الاستخدام:
(PS: الفرضية هي أن لديك بالفعل JDK مع JSTACK. من الأفضل أن يكون لديك مجموعة متغيرة البيئة.)
الخطوة 1: عرض PID من العملية من خلال Windows Task Manager
هنا أتحدث بإيجاز عن ماهية PID: PID هي هوية كل عملية. إنها هوية فريدة تم تعيينها من قبل نظام التشغيل لتحديد هوية العملية بعد بدء البرنامج.
كما هو موضح
ضمن علامة التبويب العملية ، عرض> حدد العمود
تحقق من PID وتأكيد
قم بالتبديل إلى علامة تبويب التطبيق وحدد البرنامج إلى ذاكرة Snapshot. الصورة المحددة هي Android Studio. انقر بزر الماوس الأيمن للذهاب إلى العملية.
هنا يمكننا أن نرى أن PID المقابل من Android Studio هو 9952
الخطوة الثانية هي فتح سطر الأوامر وتنفيذ برنامج JSTACK
لاحظ أنه إذا لم تتم إضافة متغير البيئة بنجاح ، فلا يمكن تنفيذه إلا في مسار JSTACK ، وإلا فلن يتعرف ذلك على نظام التشغيل.
كما هو موضح في الشكل ، هناك عمومًا معلمتان تشغيل هنا ، يتم استخدامهما لالتقاط لقطات الذاكرة.
معانيهم على النحو التالي:
-ستطبع القوائم الطويلة معلومات قفل إضافية. عند حدوث طريق مسدود ، يمكنك استخدام JSTACK -L PID لمراقبة وضع القفل
-M الوضع المختلط ، لا يخرج فقط معلومات مكدس Java ، ولكن أيضًا يخرج معلومات مكدس C/C ++ (مثل الطريقة الأصلية)
عادة ما نستخدم المعلمة -L لتلبية الاحتياجات
التنسيق كما يلي jstack -l pid >> 123.txt
ملاحظة: ملاحظة هنا >> تعني إعادة التوجيه ، مما يعني إخراج اللقطات التي تم التقاطها إلى 987.txt. >> من الأفضل الاحتفاظ بالمساحات عندما يكون مرتين
وبهذه الطريقة ، سنقوم بإنشاء ملف 987.txt في مسار سطر الأوامر ونكتب لقطة الذاكرة في هذا النص في نفس الوقت.
كما هو مبين في الشكل أدناه: