2015-02-22 21 views
8

के खिलाफ बनाया गया जब बहुत अधिक लोड होता है मेरे पास जावा में एक्लिप्स लुना में विकसित जावा एप्लिकेशन है जो अमेज़ॅन ईसी 2 (सी 3.लार्ज, अमेज़ॅन लिनक्स) में चलता है। यह एप्लिकेशन एक बहुत ही लगातार आने वाली दर पर काम करता है। जब मैं जेडीके 8u31 के खिलाफ आवेदन करता हूं, तो ईसी 2 सीपीयू लोड जेडीके 7u75 के खिलाफ बनाए गए उसी एप्लिकेशन से काफी अधिक है।जावा एप्लिकेशन सीपीयू/जेडीके 8

एप्लिकेशन मूल रूप से ईसी 2 पर डिफ़ॉल्ट जेआरई के साथ भाग गया, और मैंने जावा 8 प्रोसेस प्रतीक्षाफोर (लंबी टाइमआउट, टाइमयूनीट यूनिट) का लाभ उठाने के लिए ओपनजेडीके 1.8.0.31 जोड़ा। इस एप्लिकेशन में मुख्य कार्य में Runtime.exec का उपयोग करके एक एप्लिकेशन का आह्वान करना शामिल है।

$ sudo alternatives --config java 

There are 2 programs which provide 'java'. 

    Selection Command 
----------------------------------------------- 
* 1   /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java 
+ 2   /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-2.b13.5.amzn1.x86_64/jre/bin/java 

उदाहरण लोड औसत जब आवेदन 1.7 के खिलाफ बनाया गया है:

top - 00:20:28 up 4 days, 10:41, 4 users, load average: 0.37, 0.26, 0.52 

उदाहरण लोड औसत जब आवेदन 1.8 के खिलाफ बनाया गया है:

top - 23:45:52 up 4 days, 10:06, 4 users, load average: 2.28, 2.60, 2.01 

ऐसा लगता है जैसे कि यह संबंधित हो सकता है ओपन जेडीके 1.8.0.31 तक, लेकिन मुझे नहीं पता कि इसे कैसे डिबग करना है। कोई कोड परिवर्तन नहीं है, मैं केवल अनुपालन स्तर बदल रहा हूं और ग्रहण लुना में 1.7 और 1.8 के बीच बना हूं। कोई विचार क्यों लोड इतना अलग होगा?

अद्यतन:

मैं इसी तरह की उच्च CPU लोड देखने के लिए जब मैं EC2 पर ओरेकल JDK का उपयोग करें।

$ sudo alternatives --config java 

There are 3 programs which provide 'java'. 

    Selection Command 
----------------------------------------------- 
    1   /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java 
    2   /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-2.b13.5.amzn1.x86_64/jre/bin/java 
*+ 3   /usr/java/jdk1.8.0_31/bin/java 

लोड औसत:

top - 01:45:27 up 4 days, 12:06, 4 users, load average: 2.28, 1.50, 1.04 
+0

क्या आप इसे अपनी मशीन पर पुन: पेश कर सकते हैं? – fge

+0

मैंने इसे कई ईसी 2 उदाहरणों (ओपनजेडीके दोनों) पर देखा है। मैं अपनी स्थानीय मशीन पर वर्कलोड उत्पन्न नहीं कर सकता, लेकिन मैं काम को अनुकरण करने के तरीकों को देखूंगा। – DanielB6

+0

कंपाइलर बनाम के प्रभावों का भेदभाव करने के लिए।jre: अगर आप अनुपालन 1.7 पर संकलित करते हैं और 1.8 जून पर चलते हैं तो क्या होता है? –

उत्तर

1

प्रलेखन कहते हैं: "यदि प्रक्रिया समाप्त कर दिया है इस तरीकों चुनाव exitValue के डिफ़ॉल्ट कार्यान्वयन की जांच करने के इस वर्ग की कंक्रीट कार्यान्वयन दृढ़ता से इस ओवरराइड करने के लिए प्रोत्साहित किया जाता है। एक अधिक कुशल कार्यान्वयन के साथ विधि। "

मुझे दृढ़ता से संदेह है कि यह कारण है।

http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#waitFor--

+0

मुझे लगता है कि इस मामले के लिए संभव है जहां process.waitFor (30, TimeUnit.SECONDS) का उपयोग किया जाता है। यह उस मामले की व्याख्या नहीं करता है जहां कोई कोड परिवर्तन नहीं है, उसी प्रक्रिया। WaitFor() का उपयोग 1.7 और 1.8 में किया जाता है। – DanielB6

+1

यह सही है, मुझे टिप्पणी में याद आया। शायद waitFor() कार्यान्वयन 1.8 में त्रुटिपूर्ण है और संस्करण को टाइमआउट के साथ कॉल करता है? यह एक न्यूनतम उदाहरण के लिए एक कठिन कमी के मामले की तरह लगता है ... –

3

आप लक्षण का वर्णन किया है देखें, लेकिन मुझे नहीं लगता यह, पर जाने के लिए अगर केवल क्योंकि यह की तरह "जावा 8 उच्च CPU" कहीं भी चीज़ों की खोज करने के लिए असंभव हो जाएगा पर्याप्त है (गूगल , जावा बग परेड, आदि) और उपयोगी परिणाम मिलते हैं। दुर्भाग्यवश, आपको CPU का उपयोग करने के बारे में अधिक जानकारी एकत्र करने की आवश्यकता है। यहां कुछ विचार दिए गए हैं:

  1. VisualVM जैसे टूल के साथ प्रोफ़ाइल। लोड अंतर चरम होते हैं, इसलिए आप केवल सीपीयू का उपयोग करने में सक्षम हो सकते हैं।
  2. व्यस्त धागे खोजें। आप थ्रेड स्नैपशॉट्स का एक गुच्छा ले सकते हैं और इसे आंखों पर ले सकते हैं, या jvmtop जैसे टूल को आजमा सकते हैं।
  3. जांचें कि कचरा कलेक्टर क्या कर रहा है, या तो जीसी लॉगिंग या जेस्टैट जैसे टूल को सक्षम करके।
  4. सिस्टम कॉल के निष्पादन का पता लगाने के लिए strace का उपयोग करें।
+0

इस जानकारी के लिए धन्यवाद, मैं इन उपकरणों को देखता हूं और मेरे द्वारा एकत्र किए गए किसी भी परिणाम को वापस पोस्ट करता हूं। – DanielB6