2010-07-01 17 views
58

जब जावा अनुप्रयोग व्यतीत कर रहा है, तो आप भी उपयोग के मामले है कि इस के लिए अग्रणी रहा है और जांच करने के लिए, मैं समझता हूँ कि धागा डंप उपयोगी हो सकता है चाहता हूँ नहीं है।थ्रेड डंप विश्लेषण उपकरण/विधि

लेकिन हम आसानी से कैसे निकाले जाते हैं कर सकते हैं धागे से उपयोगी डेटा जहां समस्या है खोजने के लिए उदासीनता? सर्वर एप्लिकेशन जो मैं काम कर रहा हूं, बहुत लंबे थ्रेड डंप पैदा करता है, क्योंकि यह एक ईजेबी आर्किटेक्चर है और थ्रेड डंप में कई कंटेनर थ्रेड हैं जो मुझे यकीन नहीं है कि मुझे देखना चाहिए (यानी थ्रेड जो मेरे एप्लिकेशन कोड नहीं चला रहे हैं , लेकिन जेबॉस का कोड)।

कल मैं Thread Dump Analyzer उपकरण की कोशिश की। उपकरण टेक्स्ट एडिटर में कच्चे थ्रेड डंप को देखने से निश्चित रूप से बेहतर है, क्योंकि आप उन थ्रेड को फ़िल्टर कर सकते हैं जिनमें आप रुचि नहीं रखते हैं, थ्रेड सूची देखें, इसके विवरण देखने के लिए थ्रेड पर क्लिक करें, थ्रेड डंप की तुलना करें लंबे, धागे चल आदि नीचे स्क्रीनशॉट देखें:

Thread Dump Analyzer

लेकिन वहाँ है विश्लेषण करने के लिए अभी भी बहुत अधिक डेटा - लगभग 300 धागे। मुझे किसी भी मानदंड के बारे में पता नहीं है जिसे मैं सभी जेबॉस धागे को फ़िल्टर करने के लिए उपयोग कर सकता हूं, जिसमें मुझे रूचि नहीं है। मुझे यकीन नहीं है कि मुझे उन थ्रेडों को देखना चाहिए जो वर्तमान में केवल "रननेबल" स्थिति में हैं या यदि "स्थिति पर प्रतीक्षा करना" और "ऑब्जेक्ट.वेट में" भी महत्वपूर्ण हैं।

सामान्यतः सामान्य रूप से उपयोग किए जाने वाले दृष्टिकोण और औजारों का क्या दृष्टिकोण है?

+0

यह भी देखें https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=2245aa39-fa5c-4475-b891-14c205f7333c – oluies

+4

मैंने यह लिखा, यह थ्रेड डंप का विश्लेषण करता है, कोई स्थापना नहीं आवश्यक: http://spotify.github.io/threaddump-analyzer/ –

+0

@JohanWalles अच्छा टूल! – ycomp

उत्तर

26

अकेले थ्रेड डंप का एक सेट रूट कारण प्राप्त करने में बहुत उपयोगी नहीं होगा।

चाल धागे के 4 या 5 सेट लेने के लिए प्रत्येक के बीच 5 सेकंड के अंतराल पर उदासीनता है। तो अंत में आपके पास एक एकल लॉग फ़ाइल होगी जिसमें ऐप सर्वर पर लगभग 20-25 सेकंड की कार्रवाई होगी।

क्या आप जाँच करना चाहते हैं जब एक अटक धागे या लंबी चलने वाली लेन-देन होता है, सब धागा डंप दिखाएगा एक निश्चित धागा आईडी अपने जावा स्टैक ट्रेस में एक ही पंक्ति में है। सरल शब्दों में, लेनदेन (एक ईजेबी या डेटाबेस में कहें) कई थ्रेड डंप में फैला हुआ है और इसलिए अधिक जांच की आवश्यकता है।

अब जब आप इन्हें Samurai (मैंने स्वयं टीडीए का उपयोग किया है) के माध्यम से चलाया है, तो यह लाल रंग में इन्हें हाइलाइट करेगा ताकि आप जल्दी से उस पर क्लिक कर सकें और समस्याओं को दिखाते हुए लाइनों पर जा सकें।

this here का एक उदाहरण देखें। उस लिंक में समुराई आउटपुट छवि को देखें। हरी कोशिकाएं ठीक हैं।लाल और ग्रे कोशिकाओं को देखने की जरूरत है। नीचे दिए गए मेरे अपने वेब एप्लिकेशन से

एक समुराई उदाहरण 5 के अंतराल के पार Thread'19 के लिए एक अटक अनुक्रम 'से पता चलता - 10 सेकंड

>  Thread dump 2/3 "[ACTIVE] ExecuteThread: '19' for queue: 
> 'weblogic.kernel.Default 
> (self-tuning)'" daemon prio=7 
> tid=07b06000 nid=108 lwp_id=222813 
> waiting for monitor entry 
> [2aa40000..2aa40b30]  
> java.lang.Thread.State: BLOCKED (on 
> object monitor)  at 
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393) 
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager) 
> at 
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229) 

...

> Thread dump 3/3 "[ACTIVE] 
> ExecuteThread: '19' for queue: 
> 'weblogic.kernel.Default 
> (self-tuning)'" daemon prio=7 
> tid=07b06000 nid=108 lwp_id=222813 
> waiting for monitor entry 
> [2aa40000..2aa40b30]  
> java.lang.Thread.State: BLOCKED (on 
> object monitor)  at 
> com.bea.p13n.util.lease.JDBCLeaseManager.renewLease(JDBCLeaseManager.java:393) 
> - waiting to lock <735e9f88> (a com.bea.p13n.util.lease.JDBCLeaseManager) 
> at 
> com.bea.p13n.util.lease.Lease$LeaseTimer.timerExpired(Lease.java:229) 

अद्यतन

मैंने हाल ही में Java Thread Dump Analyzer का उल्लेख in this answer का उल्लेख किया है और यह Sa के विरोध में टोमकैट के लिए बहुत उपयोगी रहा है murai

6

मैं अगर मैं धागे कि "runnable" राज्य केवल या यदि में हैं पर विचार करना चाहिए यकीन नहीं है "शर्त इंतजार कर" और "Object.wait में" भी महत्वपूर्ण हैं।

बाद के दो वास्तव में बातें, जब एक गतिरोध के निदान के लिए देखने के लिए के रूप में आप कर पा रहे हैं। "रननेबल" का अर्थ है कि थ्रेड अभी कुछ कर रहा है (या सीपीयू प्राप्त करने का इंतजार कर रहा है)। "अवरुद्ध" और "प्रतीक्षा" क्या डेडलॉक्स बनते हैं।

बेशक, एक आवेदन कंटेनर में वैध रूप से प्रतीक्षा करने वाले बहुत सारे धागे होंगे। दिलचस्प मामलों को फ़िल्टर करने के लिए, स्टैक ट्रेस देखें। यदि यह ढांचा वर्ग है (और विशेष रूप से जिन्हें "वर्कर" या "कतार" कहा जाता है) यह शायद ठीक है। यदि यह एप्लिकेशन कोड है, तो आपको इसे और अधिक बारीकी से देखना चाहिए।

27

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने लंबे थ्रेड डंप को अधिक पठनीय बनाने में मदद करने के लिए एक टूल लिखा है।

Java Thread Dump Analysis Tool

यह उपकरण समूहों धागे एक साथ जो एक ही स्टैक ट्रेस है और आप केवल शो धागे जो विशेष राज्यों (जैसे runnable या अवरुद्ध) में हैं करने के लिए अनुमति देता है।

यह दसियों या सैकड़ों जेबॉस धागे के बीच दिलचस्प धागे को खोजने में थोड़ा तेज़ बनाता है जो अपना अधिकांश समय कोड में उसी स्थान पर काम करने की प्रतीक्षा करते हैं और इसलिए सभी में एक ही स्टैक ट्रेस होता है।

+3

महान उपकरण के लिए धन्यवाद। दरअसल यह पहला उपकरण है, जो वास्तव में मुझे वही करता है :) इसे साझा करने के लिए धन्यवाद। –

+0

यह वास्तव में उपयोगी है। मैंने हाल ही में इसे टॉमकैट टीडी पर इस्तेमाल किया और यह अवरुद्ध धागे को बहुत आसानी से इंगित करता था। – JoseK

+0

यह उपकरण वास्तव में उपयोगी है। सरल और सटीक। +1 –

संबंधित मुद्दे