تفريغ الخيط في جافا هو قائمة بجميع الخيوط النشطة في الآلة الظاهرية لجافا.
تفريغ الخيط في جافا
تفريغ الخيط في جافا مفيد جدًا في تحليل Eng analyzing Eng Eng تحليل حدوث Eng حدوث . Eng سنتعلم هنا طرقًا متعددة يمكننا من خلالها إنشاء تفريغ للخيط لبرنامج جافا. هذه التعليمات صالحة لأنظمة التشغيل * نيكس * ولكن قد تكون الخطوات مختلفة قليلاً في نظام التشغيل ويندوز.
- محلل VisualVM: إذا كنت تحلل التطبيق للبطء ، يجب عليك استخدام محلل. يمكننا إنشاء تفريغ للخيط لأي عملية باستخدام محلل VisualVM بسهولة. كل ما عليك فعله هو النقر بزر الماوس الأيمن فوق العملية الجارية والنقر على خيار “تفريغ الخيط” لإنشاءه.
- jstack: جافا مزودة بأداة jstack التي يمكننا من خلالها إنشاء تفريغ للخيط لعملية جافا. إن هذه عملية تتكون من خطوتين.
- ابحث عن معرف PID لعملية جافا باستخدام أمر
ps -eaf | grep java
- قم بتشغيل أداة jstack كما في
jstack PID
لإنشاء مخرجات تفريغ الخيط إلى وحدة التحكم ، يمكنك إلحاق مخرجات تفريغ الخيط بملف باستخدام أمر “jstack PID >> mydumps.tdump
“
- ابحث عن معرف PID لعملية جافا باستخدام أمر
- يمكننا استخدام الأمر
kill -3 PID
لإنشاء تفريع الموضوع. هذا يختلف قليلاً عن الطرق الأخرى لإنشاء تفريع الموضوع. عندما يتم إصدار أمر kill، يتم إنشاء تفريع الموضوع إلى نظام الإخراج من البرنامج. لذلك، إذا كان البرنامج جافا مع وحدة الإخراج كمخرج النظام، سيتم طباعة تفريع الموضوع على الوحدة. إذا كان البرنامج جافا هو خادم Tomcat مع وحدة الإخراج كـcatalina.out
، سيتم إنشاء تفريع الموضوع في الملف. - قدمت Java 8 الأداة
jcmd
، يجب عليك استخدامها بدلاً من jstack إذا كنت على Java 8 أو أحدث. الأمر لإنشاء تفريع الموضوع باستخدام jcmd هوjcmd PID Thread.print
.
هذه هي أربع طرق مختلفة لإنشاء تفريع الموضوع في جافا. عادةً ما أفضل استخدام أمر jstack أو jcmd لإنشاء تفريع الموضوع وتحليله. لاحظ أنه بغض النظر عن الطريقة التي تختارها، سيظل تفريع الموضوع هو نفسه.
مثال على تفريع الموضوع في جافا
في مشاركتي السابقة، شرحت حول مؤقت جافا، إليك تفريع الموضوع الذي تم إنشاؤه لنفس البرنامج.
2012-12-26 22:28:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):
"Attach Listener" daemon prio=5 tid=0x00007fb7d8000000 nid=0x4207 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Timer-0" daemon prio=5 tid=0x00007fb7d4867000 nid=0x5503 waiting on condition [0x00000001604d9000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.journaldev.threads.MyTimerTask.completeTask(MyTimerTask.java:19)
at com.journaldev.threads.MyTimerTask.run(MyTimerTask.java:12)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
"Service Thread" daemon prio=5 tid=0x00007fb7d482c000 nid=0x5303 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=5 tid=0x00007fb7d482b800 nid=0x5203 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=5 tid=0x00007fb7d4829800 nid=0x5103 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=5 tid=0x00007fb7d4828800 nid=0x5003 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=5 tid=0x00007fb7d4812000 nid=0x3f03 in Object.wait() [0x000000015fd26000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)
"Reference Handler" daemon prio=5 tid=0x00007fb7d4811800 nid=0x3e03 in Object.wait() [0x000000015fc23000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
"main" prio=5 tid=0x00007fb7d5000800 nid=0x1703 waiting on condition [0x0000000106116000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.journaldev.threads.MyTimerTask.main(MyTimerTask.java:33)
"VM Thread" prio=5 tid=0x00007fb7d480f000 nid=0x3d03 runnable
"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fb7d500d800 nid=0x3503 runnable
"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fb7d500e000 nid=0x3603 runnable
"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fb7d5800000 nid=0x3703 runnable
"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fb7d5801000 nid=0x3803 runnable
"GC task thread#4 (ParallelGC)" prio=5 tid=0x00007fb7d5801800 nid=0x3903 runnable
"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fb7d5802000 nid=0x3a03 runnable
"GC task thread#6 (ParallelGC)" prio=5 tid=0x00007fb7d5802800 nid=0x3b03 runnable
"GC task thread#7 (ParallelGC)" prio=5 tid=0x00007fb7d5803800 nid=0x3c03 runnable
"VM Periodic Task Thread" prio=5 tid=0x00007fb7d481e800 nid=0x5403 waiting on condition
JNI global references: 116
تفريغ الخيط هو قائمة بجميع الخيوط، حيث يعرض كل إدخال معلومات حول الخيط يشمل ما يلي بالترتيب:
- اسم الخيط: اسم الخيط
- أولوية الخيط: أولوية الخيط
- معرف الخيط: يمثل معرف فريد للخيط
- حالة الخيط: يوفر الحالة الحالية للخيط، على سبيل المثال، قابل للتشغيل، في انتظار، محظور. أثناء تحليل الانغلاق، ابحث عن الخيوط المحظورة والموارد التي يحاولون الحصول على قفلها.
- الكومة الداعية للخيط: يوفر معلومات الكومة الأساسية للخيط. هذا هو المكان الذي يمكننا رؤية الأقفال التي حصل عليها الخيط وما إذا كان ينتظر أي قفل.
هذا كل شيء بالنسبة لتفريغ الخيوط في جافا.
Source:
https://www.digitalocean.com/community/tutorials/java-thread-dump-visualvm-jstack-kill-3-jcmd