जावा धागा डंप पाने के लिए -3 को मारें


116

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


आप किस प्रक्रिया को मार रहे हैं? क्या यह J2EE ऐप का सर्वर है? यदि ऐसा है तो आपको स्टैण्डर्ड ट्रेस को मानक आउट में ढूंढना चाहिए।
बजे लुसियानो फियान्देसियो

मैं एक प्रक्रिया को मार रहा हूं जो जावा क्लास को चलाती है
javerd

2
चाहिए कि कंसोल पर थ्रेड डंप लिखें। चूँकि java class में std out
javanerd

जवाबों:


194

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

jstack PID > outfile

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

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

1
यदि आप उस त्रुटि को देख रहे हैं, तो मेरा सुझाव है कि आप इसे अपने विक्रेता के साथ रखें। एक त्वरित खोज शो, उदाहरण के लिए, इस त्रुटि के बारे में आरएचईएल में एक खुला बग है और ओपनजेडक ...
जोशुआ मैककिनोन

7
यह ध्यान देने योग्य है कि jstack को JDK की आवश्यकता होती है। यदि आप ऐसे सर्वर पर ऐप्स चला रहे हैं जिसमें केवल JRE स्थापित है, तो आपको थ्रेड डंपिंग के लिए दूसरा साधन ढूंढना होगा।
jeffkempf

1
यहाँ अलग-अलग उपयोगकर्ता के तहत चलने वाली प्रक्रिया के थ्रेड डंप को प्राप्त करने के लिए jstack का उपयोग कैसे किया जाता है, जैसे विंडोज़ सेवा: stackoverflow.com/questions/1197912/…
Vadzim

44

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


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

32

LogVMOutput डायग्नोस्टिक विकल्प के साथ अलग फाइल पर ब्रेक सिग्नल पर JVM थ्रेड डंप आउटपुट को रीडायरेक्ट करने का एक तरीका है :

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

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

25

चित्र में जावा 8 के साथ, jcmdपसंदीदा तरीका है।

jcmd <PID> Thread.print

निम्नलिखित Oracle दस्तावेज से स्निपेट है :

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

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


1
दुर्भाग्य से jcmdखिड़कियों सेवा प्रक्रिया से कनेक्ट करने में विफल रहता है के साथ com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach, जबकि jstack -F: सफल होता है stackoverflow.com/questions/1197912/...
वादज़्मी

1
आपको jcmd को चलाने की आवश्यकता है <pid> Thread.dump उसी उपयोगकर्ता के अंतर्गत आता है जब जावा प्रक्रिया होती है, अन्यथा आपके कनेक्शन हटा दिए जाएंगे। देखें stackoverflow.com/questions/25438983/...
Twilite

11

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


8

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

  • kill -3 <PID>: मानक आउटपुट को आउटपुट देता है।
  • एक कंसोल विंडो जहां सर्वर चल रहा है की पहुंच है, तो एक का उपयोग कर सकते हैं Ctrl+ Breakचाबियों का संयोजन STDOUT पर स्टैक ट्रेस उत्पन्न करने के लिए।
  • हॉटस्पॉट वीएम के लिए हम 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]

मुझे किल -3 <PID> का उपयोग करने में परेशानी हो रही है। यह ठीक काम करता है, लेकिन कंसोल को थ्रेड डंप लिखने के बाद भी प्रक्रिया को मारता है। क्या ऐसा करना चाहिए?
एशले

@ एशले - kill -3 <PID>जेवीएम को नहीं मारना चाहिए। आप किस प्रकार का जावा ऐप देख रहे हैं?
slm

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>

यह आपके आउटपुट / थ्रेडप को उपर्युक्त कमांड में निर्दिष्ट फ़ाइल कंसोल पर पुनर्निर्देशित करेगा।



2

यदि आप अपने स्टैंडअलोन जावा प्रक्रिया के थ्रेड डंप चाहते हैं, तो आपको जिन चरणों का पालन करना चाहिए

चरण 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.