2012-06-22 11 views
5

का उपयोग कर मेरे पास एक जावा ऐप सेंटोस 6.0 पर चल रहा है। यह हमेशा cron के माध्यम से पृष्ठभूमि में चलाता है। कभी-कभी यह ऐप 100% सीपीयू का उपयोग करते समय प्रतीक्षा स्थिति में जाता है।जावा 100% सीपीयू

मेरे जावा संस्करण है:

java version "1.6.0_17" 
OpenJDK Runtime Environment (IcedTea6 1.7.4) (rhel-1.21.b17.el6-x86_64) 
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode) 

अन्य लक्षण हैं:

एक। प्रतीत होता है कि प्रक्रिया का एक धागा एक लूप में कुछ के लिए इंतजार कर रहा है। जब strace का उपयोग कर पता लगाया है, यह ओ/p लगातार निम्न दिखाता है:

futex(0x7fb8000ac728, FUTEX_WAKE_PRIVATE, 1) = 0 
futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out) 

ज। ऐसा लगता है कि प्रक्रिया का काम पूरा हो गया है, जो फाइलों का उपयोग कर रहा है। केवल कुछ फाइलें बाकी हैं। 'Ls/proc/पीआईडी ​​/ fd/शो के उत्पादन:

lr-x------ 1 root root 64 Jun 22 13:13 0 -> pipe:[77107601] 
l-wx------ 1 root root 64 Jun 22 13:13 1 -> pipe:[77120162] 
l-wx------ 1 root root 64 Jun 22 13:13 2 -> /var/log/mithi/mcs/agent_account_mailstore_exceed_limit.sh.log 
lr-x------ 1 root root 64 Jun 22 13:13 3 -> /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar 

किसी को भी ऐसी ही स्थिति का सामना करना पड़ा है? कोई भी संकेत या संदर्भ बहुत उपयोगी होंगे।

अधिक विशेष रूप से, CentOS 6 पर पृष्ठभूमि में openjdk आधारित जावा प्रक्रियाओं को चलाने में कोई ज्ञात समस्याएं हैं?

अब मैं एक बहुत ही सरल अनंत लूप के साथ समस्या यह अनुकरण करने में सक्षम हूँ,

#!/bin/bash 

while [ 1 ] 
do 
    /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version & 
    sleep 1s 
done 

नीचे दिए गए इस स्क्रिप्ट के बारे में 3 के लिए चलाया जाता है - 4 घंटे, मैं एक या दो जावा प्रक्रियाएं हैं जो लगता है लटका दिया या समान लक्षण के साथ अनंत लूप में यानी

futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out) 

यह केवल, एकल प्रोसेसर सिस्टम पर नहीं मल्टीप्रोसेसर सिस्टम पर हो रहा है। इसे RHEL6 पर भी अनुकरण किया जा सकता है, न केवल CentOS6।

उत्तर

1

कर्नेल को कर्नेल-2.6.32-220 में अपग्रेड करने के बाद समस्या हल हो गई जो CentOS 6.2 कर्नेल है।

+0

अपस्ट्रीम [कर्नेल बग 32 9 22] (https://bugzilla.kernel.org/show_bug.cgi?id=32922) के कारण, 3.14 के बाद अपस्ट्रीम कर्नेल संस्करणों में और 3.18 में तय किया गया। लेकिन बग को कुछ डिस्ट्रोज़ (जैसे सेंटोस 6) में पहले कर्नेल संस्करणों में बैकपोर्ट में उठाया गया था। इस [Google समूह चर्चा] में लंबी बातचीत देखें (https://groups.google.com/forum/#!विषय/यांत्रिक-सहानुभूति/QbmpZxp6C64) –

4

कई संभावित कारण हैं। उन है कि मैं के बारे में सोच सकते हैं:

  1. आपका प्रक्रिया 'स्मृति उपयोग बहुत अधिकतम ढेर आकार के करीब है, कुख्यात पूर्ण जेंटलमैन कैडेट के कारण। -Xloggc:/path/to/logFile.log -XX:+PrintGCDetails विकल्पों के साथ जीसी लॉग सक्षम करें और फिर GCViewer या HPJmeter जैसे टूल का उपयोग करके इसका विश्लेषण करें।

  2. आपकी प्रक्रिया वास्तव में कुछ (एक अनंत लूप की तरह) कर रही है, और आप इसे कुछ थ्रेड डंप करके और उनका विश्लेषण करके देख सकते हैं। आप VisualVM और Thread Dump Analyzer के साथ ऐसा कर सकते हैं।

+0

जैसा कि मैंने उपरोक्त कहा है, मैं "/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version" के साथ prb अनुकरण कर सकता हूं। यह इंगित करता है कि यह न ही एक जीसी पीआरबी है, न ही आवेदन में एक अनंत लूप। – amolkul

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