मैं kill -3
यूवी में जेवीएम के थ्रेड डंप को देखने के लिए कमांड का उपयोग कर रहा हूं । लेकिन मुझे इस kill
कमांड का आउटपुट कहां मिल सकता है ? मै खो गया हूँ!!
मैं kill -3
यूवी में जेवीएम के थ्रेड डंप को देखने के लिए कमांड का उपयोग कर रहा हूं । लेकिन मुझे इस kill
कमांड का आउटपुट कहां मिल सकता है ? मै खो गया हूँ!!
जवाबों:
आप वैकल्पिक रूप से एक थ्रेड डंप लेने के लिए jstack (JDK के साथ शामिल) का उपयोग कर सकते हैं और जहां चाहें आउटपुट लिख सकते हैं। क्या यह यूनिक्स वातावरण में उपलब्ध नहीं है?
jstack PID > outfile
धागा डंप उस VM से बाहर सिस्टम के लिए लिखा है जिस पर आपने निष्पादित किया है kill -3
। यदि आप JVM के कंसोल आउटपुट को किसी फ़ाइल में रीडायरेक्ट कर रहे हैं, तो थ्रेड डंप उस फ़ाइल में होगा। यदि JVM एक खुले कंसोल में चल रहा है, तो थ्रेड डंप इसके कंसोल में प्रदर्शित होगा।
LogVMOutput डायग्नोस्टिक विकल्प के साथ अलग फाइल पर ब्रेक सिग्नल पर JVM थ्रेड डंप आउटपुट को रीडायरेक्ट करने का एक तरीका है :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
चित्र में जावा 8 के साथ, jcmd
पसंदीदा तरीका है।
jcmd <PID> Thread.print
निम्नलिखित Oracle दस्तावेज से स्निपेट है :
JDK 8 की रिलीज़ ने जावा मिशन कंट्रोल, जावा फ्लाइट रिकॉर्डर, और JVM और जावा अनुप्रयोगों के साथ समस्याओं के निदान के लिए jcmd उपयोगिता पेश की। यह बढ़ाया निदान और कम प्रदर्शन उपरि के लिए पिछले jstack उपयोगिता के बजाय नवीनतम उपयोगिता, jcmd का उपयोग करने का सुझाव दिया गया है।
हालाँकि, इस एप्लिकेशन के साथ शिपिंग के लिए निहितार्थ हो सकते हैं जो मुझे यकीन नहीं है।
jcmd
खिड़कियों सेवा प्रक्रिया से कनेक्ट करने में विफल रहता है के साथ com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
, जबकि jstack -F
: सफल होता है stackoverflow.com/questions/1197912/...
किल -3 का उपयोग करते समय मानक आउटपुट में थ्रेड डंप देखना चाहिए। अधिकांश एप्लिकेशन सर्वर एक अलग फ़ाइल में मानक आउटपुट लिखते हैं। मार -3 का उपयोग करते समय आपको इसे वहां ढूंढना चाहिए। थ्रेड डंप होने के कई तरीके हैं:
kill -3 <PID>
: मानक आउटपुट को आउटपुट देता है।हॉटस्पॉट वीएम के लिए हम jstack
थ्रेड डंप उत्पन्न करने के लिए कमांड का भी उपयोग कर सकते हैं । यह JDK का एक हिस्सा है। सिंटेक्स इस प्रकार है:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
जेवीएम को नहीं मारना चाहिए। आप किस प्रकार का जावा ऐप देख रहे हैं?
यदि आप अपने स्टैंडअलोन जावा प्रक्रिया के थ्रेड डंप चाहते हैं, तो आपको जिन चरणों का पालन करना चाहिए
चरण 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
चरण 2: बच्चे के लिए प्रोसेस आईडी प्राप्त करें जो कि आरओएबीसीडी द्वारा मंगाई गई थी। चिल्ड पाने के लिए उपरोक्त PID का उपयोग करें।
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