2011-08-24 66 views
8

मुझे अपने आवेदन में कुख्यात OutOfMemoryException का सामना करना पड़ा है और उपलब्ध हीप स्पेस की मात्रा में वृद्धि करने के बजाय मैंने समस्या को देखने की कोशिश की, बस मेरे आवेदन से कुछ प्रकार की रिसाव हुई। + HeapDumpOnOutOfMemoryError जो एक हीप डंप से उत्पन्न होने वाला OutOfMemory त्रुटि का सामना किया है:जावा हीप स्पेस - एक्सएक्सएक्स वास्तव में कैसे काम करता है?

मैं JVM पैरामीटर -XX गयी। मैंने फिर विभिन्न प्रोफाइलिंग टूल के साथ उत्पादित डंप फ़ाइल का विश्लेषण किया। मैं फिर -Xmx पैरामीटर के साथ खेलना शुरू कर दिया और पैटर्न देख रहा था।

मुझे क्या परेशान है निम्नलिखित है। ऐसा क्यों है कि डंप का विश्लेषण करने पर मैंने पाया कि सभी ऑब्जेक्ट्स का कुल आकार -Xmx पैरामीटर का उपयोग करके सेट किए गए कुल से बहुत कम था? उदाहरण के लिए, कहें कि मैंने -Xmx को '2048m' पर सेट किया है। जब मैंने डंप फ़ाइल का विश्लेषण किया तो मुझे ढेर पर कुल 400 एमबी ऑब्जेक्ट मिले। मैं 2 जीबी खोजने की उम्मीद कर रहा था। क्या मैं कुछ भूल रहा हूँ?

+0

क्या आपने जांच की है कि आपका ओओएमई वास्तव में ढेर स्मृति का उल्लेख करता है? कुछ (अपेक्षाकृत असामान्य) मामले हैं जहां ओओएमई फेंक दिए जाते हैं, लेकिन यह पूरी तरह से ढेर नहीं है। –

+1

दाएं, @ जोआचिम, जेवीएम x86 में बहुत सारे धागे भी ओओएम अपवाद – aalku

उत्तर

3

अपना त्रुटि संदेश दोबारा पढ़ें - यह आपको बता सकता है कि आप किस प्रकार की मेमोरी से बाहर निकल चुके हैं। मुझे लगता है कि यह पर्मजेन स्पेस था। पर्मजन कक्षा परिभाषाओं (अन्य चीजों के साथ) के लिए प्रयोग किया जाता है। आप पर्मजेन के लिए -XX के माध्यम से स्थान को ट्यून कर सकते हैं: MaxPermSize पर्मगेन ढेर का हिस्सा नहीं है, इसलिए हीप डंप में शामिल नहीं है।

परमगेन को देखने के बारे में अधिक जानकारी के लिए this answer देखें।

यदि यह समस्या नहीं है, तो अधिकतम प्रारंभिक ढेर आकार (-Xms) को अधिकतम के रूप में सेट करने का प्रयास करें। ऐसा करने का मतलब है कि ढेर बढ़ेगा जो समझना चाहिए कि क्या हो रहा है।

मैं आपके प्रोग्राम के चलते आपके मेमोरी उपयोग को देखने के लिए jvisualvm (जेडीके का हिस्सा) का उपयोग करने की सलाह देता हूं।

+0

के साथ दुर्घटनाग्रस्त हो सकते हैं .... हाँ मुझे जो त्रुटि मिली वह यह थी। इसे आज़माकर जानना परिणाम के साथ वापस पोस्ट करेंगे। – Kros

+0

-XX का उपयोग किया गया: MaxPermSize और तब से समस्याएं आ रही हैं। मुझे लगता है कि मेरे आवेदन में हुए नवीनतम बदलावों से सीमा पार हो गई है जो अपवाद पैदा कर रहा था। आपकी सहायता के लिए धन्यवाद. – Kros

5

मेरा अनुमान है कि चूंकि आधुनिक जीसी अलग-अलग मेमोरी क्षेत्रों (युवा/कार्यरत/स्थायी पीढ़ियों) में ढेर को विभाजित करते हैं, इसलिए स्थायी पीढ़ी की जगह पूरी तरह से स्मृति त्रुटि के बाहर भरने के लिए पर्याप्त है। आप विभिन्न जेवीएम कमांड लाइन विकल्पों का उपयोग कर विभिन्न पीढ़ी के रिक्त स्थान के अनुपात को कॉन्फ़िगर कर सकते हैं।

यहां Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine के बारे में एक अच्छा लेख है (मुझे हालिया एक नहीं मिला लेकिन मुझे लगता है कि मूल बातें अभी भी नए वीएम में लागू होती हैं)।

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