2012-05-25 15 views
18

मेरे पास एक जेनकिन्स उदाहरण है जो बिना किसी दृश्य गतिविधि के किसी प्रकार के अंतहीन पाश में फंस गया है।100% सीपीयू ले रहे चल रहे जावा प्रोग्राम का पूरा स्टैक ट्रेस कैसे प्राप्त करें?

मैं चल रही प्रक्रिया के pid प्राप्त कर सकता हूं तो मैं एक ट्रेस कैसे उत्पन्न करूं जिसका उपयोग मैं एक बग रिपोर्ट के लिए कर सकता हूं?

मैं लिनक्स पर चल रहा हूं।

उत्तर

27

jstack के साथ प्रयास करें। यह आपको आपकी धागे क्या कर रहा है की पूरी सूची देगा। इसकी आवश्यकता सभी प्रक्रिया पिड है।

+0

मैं अगर यह मेरे मामले में मदद करता है यकीन नहीं है, लेकिन यह सवाल http प्रतिक्रिया करता है: // pastebin.com/r1e0dtzp – sorin

+0

यह कुछ हद तक इसे कम करता है। यदि आपके पास 100% CPU उपयोग है, तो आप उन थ्रेड की तलाश करना चाहते हैं जो ब्लॉकिंग स्थिति में नहीं हैं। उदाहरण के लिए थ्रेड 3060 9 sun.nio.ch.EPollArrayWrapper.epollWait है जो आपकी कॉन्फ़िगरेशन के आधार पर संभवतः [इस दोष] [https://issues.apache.org/jira/browse/DIRMINA-678) से मेल खा सकता है। – mprivat

+0

हाल ही में jstack काम करना बंद कर दिया और मुझे यकीन नहीं है क्यों। यहां संबंधित प्रश्न है http://stackoverflow.com/questions/31179544/did-the-jstack-stopped-working-on-newer-jdk8-versions – sorin

2

VisualVM पर एक नज़र डालें। इसके साथ बहुत अच्छे प्रोफाइलिंग टूल हैं, और आप थ्रेड डंप कर सकते हैं।

8

थ्रेड डंप लें। विजुअल वीएम के माध्यम से कनेक्ट करें और डंप का अनुरोध करें। या यदि यूनिक्स पर हत्या -3 पिड या विंडोज पर Ctrl + ब्रेक प्रक्रिया कंसोल पर यह आपके लिए करेगा। डंप सीधे कंसोल पर जाता है। आप डंप फेंकने के लिए जेस्टैक का भी उपयोग कर सकते हैं।

+0

kill -3 pid महान काम करता है, धन्यवाद! उन लोगों के लिए जिनके पास "स्क्रीन" में चल रहा एक JVM है: ctrl-a h (अपरकेस) फ़ाइल में लॉगिंग शुरू/रोकता है। – schieferstapel

3

* nix में topH दबाकर आप धागे देख सकते हैं।

फिर jps के साथ आप pid भालू को ध्यान में रख सकते हैं कि यदि प्रक्रिया विशेषाधिकारों के साथ शुरू की गई थी तो आपको इसे sudo के साथ निष्पादित करना होगा।

यदि आप थ्रेड आईडी लेते हैं और इसे हेक्साडेसिमल में परिवर्तित करते हैं तो आप jstack pid आउटपुट के साथ उस डेटा को पार कर सकते हैं।

दोनों उपकरण $JAVA_HOME/bin में हैं।

4

लिनक्स पर Ctrl+\ (जो SIGQUIT भेजता है)

खिड़कियों पर Ctrl+Break (जो MSVCRT तहत SIGBREAK भेजता है)

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