2012-03-29 16 views
17

मेरे पास दो धागे के साथ एक चल रहा JVM है। क्या एसएस-मैक्स के साथ मेरे लिनक्स ओएस पर इन चल रहे धागे को देखना संभव है? मैं यह पता लगाने की कोशिश कर रहा हूं कि ओएस मेरे धागे को कितना प्राथमिकता दे रहा है। इस अन्य मुद्दे here के बारे में अधिक जानकारी।ps -axl के साथ लिनक्स पर चल रहे जावा थ्रेड को कैसे ढूंढें?

उत्तर

41

उपयोग

jps -v 
अपने जावा प्रक्रिया को खोजने के लिए

। नमूना आउटपुट:

3825 RemoteMavenServer -Djava.awt.headless=true -Xmx512m -Dfile.encoding=MacRoman 
6172 AppMain -Didea.launcher.port=7533 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10.app/bin -Dfile.encoding=UTF-8 
6175 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/1.6.0_31-b04-411.jdk/Contents/Home -Xms8m 

फिर

jstack 6172 

का उपयोग करें (6172 अपनी प्रक्रिया की आईडी है) JVM अंदर धागे के ढेर प्राप्त करने के लिए। इससे थ्रेड प्राथमिकता मिल सकती है। नमूना आउटपुट:

..... 
"main" **prio=5** tid=7ff255800800 nid=0x104bec000 waiting on condition [104beb000] 
    java.lang.Thread.State: TIMED_WAITING (sleeping) 
    at java.lang.Thread.sleep(Native Method) 
    at au.com.byr.Sample.main(Sample.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

..... 

आनंद लें!

संपादित करें: यदि आवेदन आपके से अलग उपयोगकर्ता के तहत चल रहा है (उत्पादन और अन्य गैर-स्थानीय वातावरण पर सामान्य मामला) तो jps/jstack sudo के माध्यम से चलाया जाना चाहिए। उदाहरण:

sudo jps -v 

sudo jstack 6172 
6

लिनक्स पर, सूर्य/ओरेकल जेवीएम देशी लिनक्स धागे का उपयोग कर जावा थ्रेड लागू करता है, इसलिए हाँ, आप उन्हें "ps" आउटपुट में देख सकते हैं। java प्रक्रिया से संबंधित कोई भी थ्रेड जावा थ्रेड है। लेकिन आप धागे के नाम नहीं देख पाएंगे, क्योंकि वे जावा के लिए विशिष्ट हैं और ओएस उनके बारे में नहीं जानता है।

लिनक्स धागे में आईडी हैं, लेकिन वे केवल संख्याएं हैं, और "ps axl" उन्हें नहीं दिखाती है। "पीएस-एलएलएफ", "एलडब्लूपी" कॉलम में करता है। ("एलडब्ल्यूपी" "लाइटवेट प्रक्रिया" के लिए छोटा है, जो थ्रेड के लिए एक और नाम है।) जावा के भीतर, Thread.getId() विधि "ps -eLf" आउटपुट में दिखाई देने वाले एलडब्ल्यूपी नंबर को वापस कर सकता है, लेकिन मैं नहीं हूं ज़रूर।

+2

आप थ्रेड आईडी के साथ 'jstack' से संबंधित कर सकते हैं। आपको हेक्स से दशमलव में कनवर्ट करने की आवश्यकता होगी। – ninjalj

+0

@ निंजालज: यह एक अच्छा जवाब हो सकता था। :) – sarnold

+1

जेस्टैक से 'निड' मान लिनक्स पीएस आउटपुट से 'tid' से मेल खाता है। आपको हेक्स मान को दशमलव में परिवर्तित करना होगा। – rohitmohta

3

ps(1) थ्रेड-चयनकर्ता स्विच H प्रक्रियाओं के रूप में धागे दिखाने के लिए ps(1) से पूछेगा। (जो मोटे तौर पर है कि वे किस तरह वैसे भी लागू किया जाता है।)

देखें:

$ ps axl | wc -l 
163 
$ ps axlH | wc -l 
325 

जाहिर है मुझे मिल गया है थ्रेडेड प्रक्रियाओं का एक बहुत अभी चल रहा है।

+1

में एलडब्ल्यूपी आईडी शीर्ष/htop के साथ भी काम करता है। इसे शुरू करें और थ्रेड मोड – moodywoody

1

आप विशेष जावा थ्रेड से जुड़े मूल टीआईडी ​​प्राप्त करने के लिए मूल कोड में जेएनआई कूद सकते हैं। फिर ओएस कमांड या procfs का उपयोग करें क्योंकि अन्य ने सुझाव दिया है या जावा के बैक के विवरण को बेहतर तरीके से भेज दिया है।

उदाहरण: मूल कोड

JNIEXPORT jlong JNICALL Java_nativeGetThreadId(JNIEnv * env, jobject obj) { 
    jlong threadId; 
    threadId = (jlong)gettid(); 
    return threadId; 
} 
+0

के लिए एच दबाएं यह समझाएगा कि यह कैसे किया जाता है। – JohnPristine

+0

@ जॉन प्रिस्टीन मैं मूल उदाहरण जोड़ूंगा। – Java42

1

आप JDK स्थापित किया है, तो आप धागे को देखने के लिए एक उपकरण jvisualvm कहा जाता है का उपयोग कर सकते हैं -

+0

विजुअल वीएम शायद सबसे अच्छा टूल है कि आपके पास सर्वर को लक्षित करने के लिए बंदरगाह खुले हैं। –

2
(और कई अन्य कार्यों के एक जावा प्रक्रिया के लिए प्रासंगिक कर स्मृति, वस्तुओं आदि पर त्वरित जांच देखें)
  1. विकल्प एच "ऑन" के साथ शीर्ष पर धागे आईडी ढूंढें, और थ्रेड पीआईडी ​​
  2. थ्रेड डंप बनाएं और अपने धागे के ढेर को ढूंढें।हेक्स प्रारूप में पीआईडी ​​हैं।
3

यहां वर्णित सभी विधियां ठीक काम करती हैं। मैं कुछ इसी तरह की खोज भी कर रहा था और इस blog में तिमुर अक्मादेव द्वारा आया था। मुझे उम्मीद है यह मदद करेगा।

संपादित करें:

एक * nux आधारित प्रणाली पर पहली बार एक

top -H 

करने के लिए क्या:

मैं साथी प्रोग्रामर द्वारा बताया गया है, के बाद एक पोस्ट के तैमूर द्वारा सार है प्रति-थ्रेड आधार पर आपको CPU उपयोग दिखाएं। उपयोगकर्ता को ऑरैकल के रूप में और जावा के रूप में कमांड में देखें। इस प्रक्रिया के लिए पीआईडी ​​नोट और फिर चलाने

top -H -p PID 

यह एक सूची है कि सभी कार्य है कि इस प्रक्रिया (जावा कार्यक्रम) वर्तमान में प्रदर्शन कर रहा है को प्रदर्शित करता है को लाता है। इसके बाद हमें यह जानने की जरूरत है कि प्रत्येक थ्रेड क्या काम कर सकता है, जिसके लिए हम एक उपयोगिता का उपयोग करते हैं जो jdk प्रदान करता है, अर्थात् jstack। लिनक्स में, जावा (जेवीएम हॉटस्पॉट) धागे को कर्नेर के धागे में मैप किया जाता है।

jstack -pid_of_the_thread 

एक धागा डंप में एक जावा धागा करने के लिए ओएस स्तर धागा नक़्शा बनाने के लिए, हम 16 आधार है, और के लिए "एनआईडी = $ आईडी" स्टैक ट्रेस में खोज करने के लिए लिनक्स से देशी थ्रेड ID बदलना होगा। उदाहरण के लिए, थ्रेड आईडी 7601 है 0x1db1 वह हो सकता है जिस पर आप निगरानी कर रहे थे। यदि आप आगे भविष्य में धागे क्या कर सकते हैं, इसके लिए नजर रखना चाहते हैं, यानी, इसके व्यवहार को ट्रैक करें, बदलावों को देखने के लिए बस एक शेल स्क्रिप्ट लिखें। उम्मीद है कि यह समझ में आता है।

+0

मैं इसे यहां रखूंगा: 'echo $ ((16 # 1 डीबी 1))' – Barak1731475

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