2011-02-02 16 views
85

प्राप्त करने के लिए 3 मार डालो मैं यूनिक्स में जेवीएम के थ्रेड डंप को देखने के लिए kill -3 कमांड का उपयोग कर रहा हूं। लेकिन मुझे इस kill कमांड का आउटपुट कहां मिल सकता है? मै खो गया हूँ!!मारवा थ्रेड डंप

+0

आप किस प्रक्रिया को मार रहे हैं? क्या यह एक जे 2 ईई ऐप सर्वर है? यदि ऐसा है तो आपको मानक आउट में स्टैक ट्रेस मिलना चाहिए। –

+0

मैं एक ऐसी प्रक्रिया को मार रहा हूं जो जावा क्लास – javanerd

+1

चलाता है, जो कंसोल पर थ्रेड डंप लिखना नहीं चाहिए। चूंकि जावा क्लास में कंसोल है – javanerd

उत्तर

158

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

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log 
+0

इसके लिए धन्यवाद। बिल्कुल !! हाँ मैं इसका उपयोग कर सकता हूँ। जेस्टैक पीआईडी> आउटफाइल उस विशेष अवधि के समय थ्रेड डंप आउटपुट करेगा। यही है ना – javanerd

+1

हां - समय पर यह चल रहा है। आप एक लंबी सूची के लिए -l (लोअरकेस एल) भी निर्दिष्ट कर सकते हैं जो अतिरिक्त लॉक जानकारी –

+2

प्रिंट करता है जब तक jstack कमांड "पते से धागे के प्रकार को कम करने में असमर्थ" के कारण लगातार विफल रहता है ;-( – noahlz

6

उसी स्थान पर जहां JVM का स्टडआउट रखा गया है। यदि आपके पास टॉमकैट सर्वर है, तो यह catalina_(date).out फ़ाइल होगी।

30

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

+1

फ़ाइल को अलग करने के लिए JVM थ्रेड डंप आउटपुट को रीडायरेक्ट करने का एक तरीका है। मेरे जवाब में देखें। – Vadzim

26

LogVMOutput diagnostic option साथ अलग फाइल को तोड़ने के संकेत पर JVM धागा डंप उत्पादन रीडायरेक्ट करने के लिए एक तरीका होता है उपरोक्त आदेश में निर्दिष्ट फ़ाइल कंसोल पर आपका आउटपुट/थ्रेडम्प।

+3

तकनीकी रूप से यह थ्रेड डंप आउटपुट को "रीडायरेक्ट" नहीं करता है। यह जेवीएम लॉगिंग चालू करता है jvm.log में (जिसमें थ्रेड डंप आउटपुट शामिल है) लेकिन मार -QUIT अभी भी प्रक्रिया के stdout (aswell) पर डंप होगा। अस्पष्ट JVM विकल्प के विवरण के लिए उपरोक्त :) – sqweek

2

Jboss में आप प्रदर्शन कर सकते हैं निम्नलिखित

nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null & 
kill -3 <java_pid> 

इस रीडायरेक्ट करेगा:

jstack PID > outfile 
7

हत्या -3 का उपयोग करते समय मानक आउटपुट में थ्रेड डंप देखना चाहिए। अधिकांश एप्लिकेशन सर्वर मानक आउटपुट को एक अलग फ़ाइल में लिखते हैं। हत्या -3 का उपयोग करते समय आपको इसे वहां खोजना चाहिए। थ्रेड डंप प्राप्त करने के कई तरीके हैं:

  • किल -3: मानक आउटपुट में आउटपुट देता है।
  • यदि किसी के पास कंसोल विंडो तक पहुंच है जहां सर्वर चल रहा है, तो कोई स्टडी आउटपुट पर स्टैक ट्रेस उत्पन्न करने के लिए कुंजी के Ctrl + Break संयोजन का उपयोग कर सकता है।
  • हॉटस्पॉट वीएम के लिए हम थ्रेड डंप उत्पन्न करने के लिए jstack कमांड का भी उपयोग कर सकते हैं। यह जेडीके का हिस्सा है। उपयोग:: jstack [-l] (चलने वाली प्रक्रिया से कनेक्ट करने) jstack एफ [मी] [-l] (एक त्रिशंकु प्रक्रिया से कनेक्ट करने)
  • JRockit JVM के लिए हम उपयोग कर सकते हैं सिंटेक्स इस प्रकार है jRCMD आदेश जो JDK सिंटेक्स के साथ आता है: jrcmd [[]] [-l] [-f फ़ाइल] [-p] -h]
2
  1. प्रक्रिया आईडी [पी एस आईडी]
  2. jcmd निष्पादित खोजें [पीएस आईडी] थ्रेड.प्रिंट
17

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

jcmd <PID> Thread.print 

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

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

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

+0

दुर्भाग्यवश 'jcmd'' com.sun.tools.attach.AttachNotSupportedException के साथ विंडोज सेवा प्रक्रिया से कनेक्ट करने में विफल रहता है: 'jstack -F' के दौरान अपर्याप्त स्मृति या अपर्याप्त विशेषाधिकार' सफल होता है: https://stackoverflow.com/questions/1197912/cant-debug-java-windows-services-with-jhat-jps-jstack/47723393#47723393 – Vadzim

1

कदम है कि आप का पालन करना चाहिए अगर आप अपने स्टैंडअलोन जावा प्रक्रिया की धागा डंप चाहते

चरण 1: जावा कार्यक्रम

linux$ ps -aef | grep "runABCD" 

user1 **8535** 4369 0 Mar 25 ?   0:00 /bin/csh /home/user1/runABCD.sh 

user1 17796 17372 0 08:15:41 pts/49  0:00 grep runABCD 

चरण बुला खोल स्क्रिप्ट के लिए प्रक्रिया ID प्राप्त करें 2: रनएबीसीडी द्वारा आमंत्रित किए गए बच्चे के लिए प्रक्रिया आईडी प्राप्त करें। बच्चों को पाने के लिए उपरोक्त पीआईडी ​​का प्रयोग करें।

linux$ ps -aef | grep **8535** 

user1 **8536** 8535 0 Mar 25 ?   126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer 

user1 8535 4369 0 Mar 25 ?   0:00 /bin/csh /home/user1/runABCD.sh 

user1 17977 17372 0 08:15:49 pts/49  0:00 grep 8535 

चरण 3: विशेष प्रक्रिया के लिए JSTACK प्राप्त करें। अपनी XYSServer प्रक्रिया की प्रक्रिया आईडी प्राप्त करें। यानी 8536

linux$ jstack **8536** > threadDump.log 
संबंधित मुद्दे