8

मैं एक सर्वर अनुप्रयोग है कि, दुर्लभ अवसरों में, स्मृति के बड़े हिस्से का आवंटन कर सकते हैं परे चला जाता है।बाध्य करें पूरा कचरा संग्रहण जब स्मृति कब्जे एक निश्चित सीमा से

के रूप में यह स्मृति रिसाव नहीं है, इन हिस्सों को कचरा कलेक्टर द्वारा पूर्ण कचरा संग्रह निष्पादित करके वापस दावा किया जा सकता है। सामान्य कचरा संग्रह स्मृति की मात्रा को मुक्त करता है जो बहुत छोटे होते हैं: यह इस संदर्भ में पर्याप्त नहीं है।

कचरा कलेक्टर उपयुक्त मानते समय इन पूर्ण जीसी को निष्पादित करता है, अर्थात् जब अनुप्रयोग की स्मृति पदचिह्न अधिकतम -Xmx के साथ निर्दिष्ट आवंटित अधिकतम के पास होता है।

कि ठीक हो सकता है, अगर यह सच है कि इन समस्याग्रस्त स्मृति आवंटन फटने में आते हैं के लिए नहीं था, और तथ्य यह है कि JVM करने के लिए पर्याप्त जल्दी से एक जीसी प्रदर्शन करने में सक्षम नहीं है की वजह से OutOfMemoryErrors पैदा कर सकता है आवश्यक स्मृति मुक्त करें। अगर मैं मैन्युअल रूप से System.gc() को कॉल करता हूं, तो मैं इस स्थिति को रोक सकता हूं।

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

लंबी कहानी कम: (? एक कमांड लाइन विकल्प) मैं (यानी एक पूर्ण जीसी प्रदर्शन) आदेश जल्दी स्मृति का एक अच्छा राशि जारी करने के लिए JVM कॉन्फ़िगर करने के लिए जब स्मृति कब्जे एक निश्चित सीमा तक पहुंच जाता कोई तरीका होना चाहिए, मैं डॉन अगर यह थोड़ी देर में हर बार मेरे आवेदन को धीमा कर देता है तो परवाह नहीं है।

अब तक पीढ़ियों के आकार को संशोधित करने के तरीके हैं सभी मैंने पाया है, लेकिन है कि मैं क्या (कम से कम नहीं सीधे) की जरूरत नहीं है।

मैं अपने सुझाव की सराहना करेंगे,

सिल्वियो

पी.एस. मैं बड़े आवंटन से बचने के लिए एक रास्ते पर काम कर रहा हूँ, लेकिन यह एक लंबे समय की आवश्यकता हो सकती है और इस बीच मेरे ऐप एक छोटे से स्थिरता

अद्यतन की जरूरत है: jvisualvm साथ ऐप्लिकेशन का विश्लेषण, मैं देख सकता है कि समस्या में है पुरानी पीढ़ी

उत्तर

6
here से

(यह एक 1.4.2 पेज है, लेकिन एक ही विकल्प सभी सूर्य JVMs में मौजूद होना चाहिए):

आप सीएमएस कचरा कलेक्टर (जो मेरा मानना ​​है कि सर्वर डिफ़ॉल्ट रूप से चालू हो जाती है का उपयोग कर रहे संभालने), जिस विकल्प को आप चाहते हैं वह

-XX:CMSInitiatingOccupancyFraction=<percent> 

जहां% उपयोग में स्मृति का%% है जो एक पूर्ण जीसी ट्रिगर करेगा।

सम्मिलित मानक यहाँ अस्वीकरण कि जी सी मानकों के साथ खिलवाड़ आप गंभीर प्रदर्शन समस्याओं दे सकते हैं, मशीन आदि द्वारा बेतहाशा बदलता

0

-सर्वर विकल्प का उपयोग करने का प्रयास करें। यह समांतर जीसी सक्षम करेगा और यदि आप बहु कोर प्रोसेसर का उपयोग करते हैं तो आपके पास कुछ प्रदर्शन वृद्धि होगी।

+0

मैं पहले से ही इसका उपयोग कर रहा हूं –

0

क्या आपने जी 1 जीसी के साथ खेलने की कोशिश की है? यह 1.6.0u14 में बाद में उपलब्ध होना चाहिए।

1

क्या आप जानते हैं जो कचरा संग्रहण पूल में से बहुत बड़ी बढ़ रहे हैं? .... यानी। ईडन बनाम उत्तरजीवी अंतरिक्ष? (JVM विकल्प -Xloggc:<file> log GC status to a file with time stamps आज़माएं) ... जब आप इसे जानते हैं, तो आपको यहां उल्लेखित विकल्पों में से एक के साथ प्रभावित पूल के आकार को ट्विक करने में सक्षम होना चाहिए: hotspot options for Java 1.4

मुझे पता है कि पृष्ठ 1.4 जेवीएम के लिए है, मुझे अपने मौजूदा 1.6 इंस्टॉल सहायता विकल्पों पर समान -X विकल्प नहीं मिल रहे हैं, जब तक कि उन व्यक्तिगत पूल आकारों को सेट न किया जाए, एक मानक, गैर-मानक सुविधा है!

+0

समस्या निश्चित रूप से पुरानी पीढ़ी है, जैसा कि jvisualvm –

1

जीसी here कैसे काम करता है और यह विभिन्न मेमोरी पूल/पीढ़ियों के लिए उपलब्ध स्मृति को नियंत्रित करने के लिए पैरामीटर सूचीबद्ध करता है, इसकी एक विस्तृत विस्तृत व्याख्या है।

+1

plz को अपडेट किया गया है या उत्तर को हटा दें। धन्यवाद। – user1050755

+0

टिप्पणी के लिए धन्यवाद, लिंक अद्यतन। –

3

जब आप बड़ी वस्तुओं है कि युवा पीढ़ी में फिट नहीं बैठते आवंटित, वे तुरंत पर्याप्त पीढ़ी अंतरिक्ष में आवंटित किए जाते हैं। यह जगह केवल जीसी है जब पूर्ण जीसी चलाया जाता है जिसे आप मजबूर करने का प्रयास करते हैं।

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

तो कुछ ही समय बाद कि दूसरी बड़ी आवंटन अपने फट में अनुरोध किया जाता है, यह एक ही बात फिर से करना होगा। इस बात पर निर्भर करता है कि प्रारंभिक ऑब्जेक्ट की अभी भी आवश्यकता है या नहीं, यह या तो जीसीइंग में सफल होने में सक्षम होगा, जिससे अगले आवंटन के लिए जगह बनायी जा सकेगी, या विफल हो सकता है यदि पहले उदाहरण को अभी भी संदर्भित किया गया हो।

आप कहते हैं कि "मुझे इस तरह [...] जल्दी स्मृति का एक अच्छा राशि जारी करने के लिए की जरूरत है (अर्थात एक पूर्ण जीसी प्रदर्शन) जब स्मृति कब्जे एक निश्चित सीमा तक पहुंच जाता"। परिभाषा के अनुसार यह केवल सफल हो सकता है, अगर आपके "एप्लिकेशन की अच्छी मात्रा" का संदर्भ अब आपके आवेदन में कुछ भी नहीं है।

क्या मैं यहाँ समझ में से, आप एक दौड़ शर्त है जो आप कभी कभी मैनुअल जीसी अनुरोध interspersing से बचने के सकता है हो सकता है। आम तौर पर आपको इन चीजों के बारे में चिंता करने की ज़रूरत नहीं है - मेरे अनुभव से आउटऑफमेमरी केवल तब होता है जब वास्तव में कई आवंटन ढेर में फिट होने के लिए होते हैं। अन्य सभी परिस्थितियों में "केवल" समस्या एक प्रदर्शन अवक्रमण होना चाहिए (जो परिस्थितियों के आधार पर चरम हो सकता है, लेकिन यह एक अलग समस्या है)।

मेरा सुझाव है कि आप इस पर शासन करने के लिए सही समस्या का और विश्लेषण करें। मैं VisualVM उपकरण की अनुशंसा करता हूं जो जावा 6 के साथ आता है। इसे प्रारंभ करें और VisualGC प्लगइन स्थापित करें। यह आपको विभिन्न स्मृति पीढ़ियों और उनके आकार को देखने की अनुमति देगा। आपके द्वारा उपयोग किए जाने वाले वीएम के आधार पर, जीसी से संबंधित लॉगिंग विकल्पों की भी एक बड़ी संख्या है। कुछ उत्तरों का उल्लेख अन्य उत्तरों में किया गया है।

कौन सी जीसी का उपयोग करने के लिए और थ्रेसहोल्ड को ट्विक करने के लिए चुनने के लिए अन्य विकल्प आपके मामले में कोई फर्क नहीं पड़ता है, क्योंकि वे सभी किसी भी समय आपके आवेदन की ज़रूरत वाले सभी ऑब्जेक्ट्स को रखने के लिए पर्याप्त स्मृति उपलब्ध हैं। यदि आपके पास भारी जीसी गतिविधि से संबंधित प्रदर्शन समस्याएं हैं, तो मुझे ये विकल्प उपयोगी हो सकते हैं, लेकिन मुझे डर है कि वे आपके विशेष मामले में समाधान नहीं ले पाएंगे।

एक बार जब आप क्या वास्तव में हो रहा है और अधिक विश्वास कर रहे हैं, एक समाधान खोजने के लिए आसान हो जाएगा।

+0

हाँ, मुझे विश्वास है कि यह दौड़ की स्थिति है। मुझे लगता है कि क्या होता है निम्न है: मेरे एप्लिकेशन को स्मृति आवंटन के लिए कई अनुरोध प्राप्त होते हैं, जो स्मृति की आवश्यकता वाले थ्रेड को धीमा करते हैं। जबकि ये धागे काम कर रहे हैं, वे कुछ भी जारी नहीं कर सकते हैं, इसलिए वे स्मृति के टुकड़ों पर पकड़ते हैं, इस बीच एक कचरा संग्रह प्रणाली को और धीमा कर देता है, इस प्रकार अन्य धागे को एक दुष्चक्र में स्मृति जारी करने से रोकता है। –

1

JVM केवल फेंकने के लिए एक OutOfMemoryError के बाद यह कचरा संग्रहण के माध्यम से स्मृति को रिहा करने का प्रयास किया गया है (the API docs for OutOfMemoryError और the JVM specification दोनों के अनुसार) माना जाता है। इसलिए कचरे के संग्रह को मजबूर करने के आपके प्रयासों में कोई फर्क नहीं पड़ता है। तो यहां कुछ और महत्वपूर्ण हो सकता है - या तो आपके प्रोग्राम में कोई समस्या संदर्भों को ठीक से साफ़ नहीं कर रही है या कम संभावना है, एक जेवीएम बग।

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