एक एप्लिकेशन जिसे हमने हाल ही में "java.lang.OutOfMemoryError" के बारे में एक संदेश के साथ दुर्घटनाग्रस्त रूप से क्रैश करना शुरू कर दिया है: चंक :: नया के लिए 858 9934608 बाइट्स का अनुरोध किया। स्वैप स्पेस से बाहर? "।जावा जेआईटी कंपाइलर आउटऑफमेमरी एरर
मैं नेट पर चारों ओर देखा है, और हर जगह सुझाव
- तक ही सीमित हैं स्मृति सेटिंग्स के साथ जावा
- बेला के पिछले संस्करण पर वापस सर्वर मोड के बजाय
- उपयोग ग्राहक
पिछले संस्करण पर वापस जाने का तात्पर्य है कि नए जावा में एक बग है, लेकिन मैंने इसका कोई संकेत नहीं देखा है। स्मृति बिल्कुल कोई मुद्दा नहीं है; सर्वर में 32 जीबी उपलब्ध है, और एक्सएमएक्स 20 पर सेट है जबकि एक्सएमएस 10 है। मैं शेष 12 जीबी से बाहर चलने वाले जेवीएम को नहीं देख सकता (मशीन पर अन्य प्रक्रियाओं के मुकाबले कम राशि)। और हम एप्लिकेशन और पर्यावरण की प्रकृति के कारण सर्वर मोड से फंस गए हैं।
जब मैं एप्लिकेशन के लिए मेमोरी और सीपीयू उपयोग को देखता हूं, तो मुझे पूरे दिन लगातार स्मृति उपयोग दिखाई देता है, लेकिन फिर अचानक मरने से ठीक पहले CPU उपयोग 100% तक चला जाता है और स्मृति उपयोग एक्स से जाता है, एक्स + 2 जीबी, एक्स + 4 जीबी, (कभी-कभी) एक्स + 8 जीबी, जेवीएम मौत के लिए। ऐसा लगता है कि जेआईटी संकलन में दोहराए गए सरणी आकार बदलने का चक्र हो सकता है।
मैंने अब ऊपर 8 जीबी अनुरोध और 16 जीबी अनुरोधों के साथ त्रुटि देखी है। हर बार, यह घटित होने पर विधि संकलित की जाती है। यह एक साधारण विधि है जिसमें गैर-नेस्टेड लूप, कोई रिकर्सन नहीं है, और ऑब्जेक्ट्स पर विधियों का उपयोग करता है जो स्थिर सदस्य फ़ील्ड या इंस्टेंस सदस्य फ़ील्ड को कम गणना के साथ सीधे लौटाते हैं।
- किसी को भी किसी भी सुझाव हैं:
तो मैं 2 प्रश्न हैं?
- क्या मैं परीक्षण कर सकता हूं कि परीक्षण प्रक्रिया पर इस विशिष्ट विधि को संकलित करने में कोई समस्या है, पूरे एप्लिकेशन को चलाने के बिना, सीधे जेआईटी कंपाइलर का आह्वान करते हुए? या क्या मुझे एप्लिकेशन शुरू करना चाहिए और इसे बहुत छोटी कॉल गिनती (जैसे 2) के बाद विधियों को संकलित करने के लिए कहा जाना चाहिए ताकि इसे दिन में एक यादृच्छिक बिंदु के बजाय लगभग तुरंत संकलित करने के लिए मजबूर किया जा सके?
@StephenC
JVM 1.6.0_20 (पहले 1.6.0_0), सोलारिस पर चल रहा है। मुझे पता है कि यह संकलन है जो कुछ कारणों से समस्या पैदा कर रहा है।
- सेकंड के उस तक पहुंचने में
ps
से पता चलता आईडी (jstack से) संकलक धागा करने के लिए इसी के साथ एक जावा धागा CPU समय jstack
की 100% अप ले जा रहा है पता चलता है कि इस मुद्दे कोJavaThread "CompilerThread1" daemon [_thread_in_native, id=34, ...]
में है
jstack
में उल्लिखित विधि हमेशा एक ही है, और हमने लिखा है। यदि आप नमूना jstack
आउटपुट देखते हैं तो आपको पता चलेगा कि मेरा क्या मतलब है, लेकिन स्पष्ट कारणों से मैं कोड नमूने या फ़ाइल नाम प्रदान नहीं कर सकता। मैं कहूंगा कि यह एक बहुत ही सरल विधि है। Essentiall कुछ हद तक शून्य जांच, 2 लूप के लिए जो समानता जांच करता है और संभवतः मान असाइन करता है, और कुछ सरल विधि बाद में कॉल करता है।सभी कोड की 40 लाइनों में सभी।
यह समस्या 2 सप्ताह में 2 बार हुई है, हालांकि एप्लिकेशन हर दिन चलता है और दैनिक पुनरारंभ होता है। इसके अलावा, आवेदन इनमें से किसी भी समय भारी भार के तहत नहीं था।
यह उपयोगी होगा अगर आपने कहा कि आप जो जेवीएम संस्करण और पैच स्तर का उपयोग कर रहे हैं (और यह पहले क्या था) और आपका ओएस/हार्डवेयर प्लेटफार्म क्या है। साथ ही, आपने यह निष्कर्ष निकाला है कि समस्या जेआईटी संकलन के दौरान हो रही है, आपने जिस तरीके को संकलित किया है, उसे समझ लिया है ... और विधि का कोड कैसा दिखता है। –
क्या आपको एक संतोषजनक समाधान मिला? –
* बहुत * देर से उत्तर के लिए खेद है - मैंने जवाब अब ध्वजांकित किया है – Phil