2013-01-02 15 views
18

मैं थ्रेड डंप लेने के दृष्टिकोण के बीच मतभेदों का विश्लेषण कर रहा हूं। नीचे उनमें से जोड़ी मैं एक JMX सेम जो एक घोषित सेम आपरेशन क्लिक करने पर() Runtime.exec के माध्यम से चलाता है jstack परिभाषितउत्पादन में थ्रेड डंप लेना

  1. पर शोध कर रहा हूँ रहे हैं।

  2. डेमॉन थ्रेड निष्पादित "प्रबंधनFactory.getThreadMXBean()। डंपअल्ट थ्रेड (सत्य, सत्य)" एक पूर्वनिर्धारित अंतराल के बाद बार-बार।

दोनों के बीच तुलना करना धागा डंप आउटपुट, मैं दृष्टिकोण 2

  1. थ्रेड डंप दृष्टिकोण 2 के साथ लॉग इन के साथ नीचे नुकसान देख TDA तरह
  2. खुला स्रोत धागा डंप विश्लेषक द्वारा पार्स नहीं किया जा सकता है आउटपुट में मूल थ्रेड आईडी शामिल नहीं है जो उच्च सीपीयू मुद्दों का विश्लेषण करने में उपयोगी हो सकती है (दाएं?)
  3. और भी?

मैं

  1. पर सुझाव/आदानों प्राप्त करने की सराहना करेंगे वहाँ रहे हैं उत्पादन कोड में Runtime.exec() के माध्यम से jstack को क्रियान्वित करने के किसी भी नुकसान? विभिन्न ऑपरेटिंग सिस्टम पर कोई संगतता मुद्दे - विंडोज़, लिनक्स?

  2. थ्रेड डंप लेने के लिए कोई अन्य दृष्टिकोण?

धन्यवाद।

संपादित करें -

1 और 2 की एक संयुक्त दृष्टिकोण जाने का रास्ता हो रहा है। हमारे पास थ्रेड डंप विश्लेषकों द्वारा समझा गया प्रारूप में लॉग फ़ाइल में थ्रेड डंप को पृष्ठभूमि में चलने वाला एक समर्पित धागा हो सकता है। यदि कोई अतिरिक्त जानकारी की आवश्यकता है (जैसे कि शायद मूल थ्रेड आईडी कहें) जो केवल जेस्टैक आउटपुट द्वारा लॉग इन है, हम इसे मैन्युअल रूप से आवश्यकतानुसार करते हैं।

+0

क्या यह एक जेईई आवेदन के संबंध में है? –

+0

@WaleedMadanat हां –

उत्तर

29

आप बॉक्स जहां प्रक्रिया चल रही है पर उपयोगकर्ता के रूप में चल

jstack {pid} > stack-trace.log 

उपयोग कर सकते हैं।

यदि आप इसे कई बार चलाते हैं तो आप diff का उपयोग कर सकते हैं यह देखने के लिए कि कौन से थ्रेड अधिक आसानी से सक्रिय हैं।


स्टैक निशान का विश्लेषण करने के लिए मैं एक समर्पित धागे में समय-समय पर नमूना का उपयोग करता हूं।

Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); 

इस जानकारी का उपयोग करके आप थ्रेड की आईडी प्राप्त कर सकते हैं, राज्य चला सकते हैं और स्टैक निशान की तुलना कर सकते हैं।

+0

जेस्टैक निष्पादित करने का पहला बिंदु उपर्युक्त दृष्टिकोण 1 जैसा ही है? जेएमएक्स के माध्यम से इसे एकीकृत और ट्रिगर करने से उपयोगकर्ता को आईडी आईडी के बारे में चिंता करने में मदद मिलती है। जेएमएक्स दृष्टिकोण के साथ, हम प्रत्येक निर्दिष्ट अंतराल के बाद बार-बार निष्पादित करने के लिए जेस्टैक शेड्यूल कर सकते हैं। Thread.getAllStackTraces() को कॉल करने के बारे में दूसरे बिंदु के बारे में; इसका मतलब यह होगा कि मैं थ्रेड डंप को मैन्युअल रूप से इस तरह से लॉग इन करता हूं कि इसे थ्रेड डंप विश्लेषकों द्वारा व्याख्या किया जाता है। आपके द्वारा उल्लेख किए जाने वाले पहले दृष्टिकोण पर इस दृष्टिकोण का क्या फायदा है? –

+0

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

3

यदि यह एक * निक्स मैं kill -3 <PID> कोशिश करता हूं, लेकिन फिर आपको प्रक्रिया आईडी पता होना चाहिए और शायद आपके पास कंसोल तक पहुंच नहीं है?

+0

हां। कंसोल तक पहुंच और प्रक्रिया आईडी प्राप्त करने से "मार" दृष्टिकोण के साथ समस्याएं हैं। ऊपर बताए गए दृष्टिकोणों में इन दोषों की कमी नहीं है। –

0

मैं सुझाव देता हूं कि यदि आप ऐसा env है तो स्टेजिंग वातावरण पर सभी ढेर विश्लेषण करें, फिर किसी भी उत्पादन पर आपके आवश्यक एप्लिकेशन सर्वर ट्यूनिंग को प्रतिबिंबित करें। यदि आपको अपने एप्लिकेशन के मेमोरी उपयोग के विश्लेषण के लिए डंप की आवश्यकता है, तो शायद आपको इसे बेहतर विश्लेषण के लिए प्रोफाइलिंग पर विचार करना चाहिए।

हीप डंप आमतौर पर OutOfMemoryExceptions के परिणामस्वरूप मेमोरी लीक और खराब मेमोरी प्रबंधन के परिणामस्वरूप उत्पन्न होते हैं।

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

+0

मैं थ्रेड डंप प्राप्त करने के ऊपरी हिस्से को समझता हूं लेकिन उत्पादन वातावरण में क्या हो रहा है इसकी स्पष्ट समझ प्राप्त करने के लिए हमें इस सुविधा की आवश्यकता है। हम ग्लासफ़िश एप्लिकेशन सर्वर का उपयोग करते हैं और ग्लासफ़िश में थ्रेड डंप प्राप्त करना कुछ खास नहीं है। आपको जेवीएम को एक हत्या संकेत भेजना होगा जिसमें @ पीटर Lljenbery के जवाब में दो दोष हैं। –

+0

समझ गया, तो मैं आपको मेमोरी डंप सक्षम (शायद एक कॉन्फ़िगरेशन के माध्यम से) के साथ एक विशेष निर्माण का उपयोग करने की सलाह दूंगा और आपके मूल्यांकन के लिए गेज चीजें, फिर इसे पूरा करने के बाद इसे अक्षम कर दूंगा। इस तरह, आपको jstack या किसी अन्य ऐसे दृष्टिकोण का उपयोग करने के निहितार्थ के बारे में चिंता करने की आवश्यकता नहीं होगी। असल में, इस परिदृश्य में jstack ठीक होगा। आपको यह [लिंक] (http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html) भी जांचना चाहिए, इससे थोड़ा सा मदद मिल सकती है (वर्णन अनुभाग पर स्क्रॉल करें) । –

+0

तो आप ऊपर दिए गए मेरे विवरण से दृष्टिकोण 2 की सिफारिश कर रहे हैं? ऊपर बताए गए नुकसानों पर आपके विचार क्या हैं? क्या आपको लगता है कि उत्पादन वातावरण में runtime.exec() को निष्पादित करने में कोई समस्या होगी? –

5

तस्वीर 8 में जावा के साथ, जेसीएमडी पसंदीदा दृष्टिकोण है।

jcmd <PID> Thread.print 

बाद Oracle documentation से स्निपेट है:

JDK 8 की रिहाई की शुरुआत की जावा मिशन नियंत्रण, जावा उड़ान रिकॉर्डर, और JVM और Java अनुप्रयोगों के साथ समस्याओं के निदान के लिए jcmd उपयोगिता। उन्नत डायग्नोस्टिक्स और कम प्रदर्शन ओवरहेड के लिए पिछले जेस्टैक उपयोगिता के बजाय नवीनतम उपयोगिता, जेसीएमडी का उपयोग करने का सुझाव दिया गया है।

हालांकि, आवेदन के साथ इसे शिपिंग करना लाइसेंसिंग प्रभाव हो सकता है जो मुझे यकीन नहीं है।

+0

यह जानना अच्छा है। क्या उन्हें टीडीए जैसे ओपन सोर्स थ्रेड डंप विश्लेषकों द्वारा पार्स किया जा सकता है? क्या वे मूल धागा आईडी शामिल करते हैं? –

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