2012-11-13 34 views
7

मुझे स्थिति का विश्लेषण करने के लिए 2 deadlocked धागे के ढेर में देखने की जरूरत है। JVM अभी लाइव है और डेटा वहां है, लेकिन मुझे प्रक्रिया से निकालने के लिए किसी प्रकार का टूल चाहिए। मुझे केवल String प्रकार के ढेर में 6 चर की परवाह है। किसी भी विचार का बहुत आभार माना जाएगा। JVM संस्करण 6_35, यह linux है, JMX सक्षम है, लेकिन मेरे पास profiler/debugger कनेक्शन कॉन्फ़िगर नहीं है। पुनरुत्पादन करना बहुत मुश्किल है।क्या मैं लाइव जेवीएम से मौजूदा थ्रेड स्टैक चर को डंप कर सकता हूं?

+3

हैलो डाउन-वोटर? – ShiDoiSi

उत्तर

3

आप इसे आसानी से नहीं कर सकते हैं। सामान्य jstack उपकरण केवल स्टैक डंप करेगा। तकनीकी रूप से आप पूरे ढेर को डंप करने का प्रयास कर सकते हैं (jmap का उपयोग करके) लेकिन यदि संभव हो तो इस विशेष चर की तलाश करना दर्द हो सकता है।

ध्यान दें कि यह सुरक्षा कारणों से आसानी से करने योग्य नहीं है। स्टैक निशान में प्रमाण-पत्र या अन्य संवेदनशील डेटा हो सकते हैं।

+2

मुझे संदेह है कि यह सुरक्षा कारणों से है, "आसानी से करने योग्य नहीं" कभी भी एक अच्छा दृष्टिकोण नहीं है जहां हैकिंग का संबंध है। बस मेरे 2 सेंट। –

0

आप के रूप में होगा IBM's JVM, प्रक्रिया एक SIGQUIT जो आपको एक dump and keep the VM running दे देंगे भेज सकते हैं, सूर्य/Oracle JVM के साथ एक यूनिक्स की तरह ओएस पर - यकीन नहीं करता है, तो उत्पादन अपने उद्देश्यों के लिए उपयुक्त, कठिन हो जाएगा। शायद दूसरे उत्तर में jstack/jmap के समान।

+0

यह सिर्फ थ्रेड डंप (प्रत्येक थ्रेड के लिए बुलाए गए तरीकों का अनुक्रम) देता है प्रत्येक थ्रेड में चर की स्थिति नहीं। –

1

मुझे एक हीप डंप दर्शक का उपयोग करके एक छोटी सी चाल मिली (इस उदाहरण में आपकाकिट, लेकिन अन्य भी काम कर सकते हैं)। असल में आप थ्रेड क्लास के सभी उदाहरणों की गणना करते हैं, फिर आपको वह थ्रेड मिल जाता है जिसे आप नाम से चाहते हैं और इसे खोलें। ढेर चर < स्थानीय चर> इस तरह के रूप में चिह्नित कर रहे हैं:

enter image description here

सभी चर यहाँ नहीं हैं, लेकिन यह सब विधि के लिए तर्क के रूप में पारित कर रहे हैं प्रदर्शित होते हैं। मुझे आश्चर्य है कि क्या प्रोफाइलर इस मुद्दे को और भी बेहतर तरीके से संबोधित कर सकते हैं?