जीसी ओवरहेड सीमा पार हो गई


93

JVM 'java.lang.OutOfMemoryError: GC ओवरहेड सीमा पार करने के लिए' का उपयोग करने का नमूना लेने का समय क्या है? मुझे पता है कि आप पैरामीटर GCTimeLimit और GCHeapFreeLimit के साथ 98% और 2% को नियंत्रित कर सकते हैं लेकिन नमूना समय क्या है?

जवाबों:


82

से जावा SE 6 हॉटस्पॉट [टीएम] वर्चुअल मशीन कूड़ा संग्रह ट्यूनिंग

निम्नलिखित

अत्यधिक जीसी समय और आउटऑफ़मेरीऑरर

समवर्ती कलेक्टर एक आउटऑफमेमोरी एरोर को फेंक देगा यदि बहुत अधिक समय कचरा संग्रह में खर्च किया जा रहा है: यदि कुल समय का 98% से अधिक समय कचरा संग्रह में खर्च किया जाता है और 2% से कम हीप बरामद किया जाता है, तो एक आउटऑफमेमोइरोर फेंका जाएगा। यह सुविधा अनुप्रयोगों को कम या कोई प्रगति नहीं करते हुए विस्तारित अवधि के लिए चलने से रोकने के लिए डिज़ाइन की गई है क्योंकि ढेर बहुत छोटा है। यदि आवश्यक हो, तो कमांड लाइन में विकल्प -XX: -UseGCOverheadLimit जोड़कर इस सुविधा को अक्षम किया जा सकता है।

नीति समान है कि समानांतर कलेक्टर में, उस समय को छोड़कर समवर्ती संग्रह प्रदर्शन 98% समय सीमा की ओर नहीं गिना जाता है। दूसरे शब्दों में, केवल संग्रह का प्रदर्शन किया जाता है जबकि एप्लिकेशन को अत्यधिक GC समय की ओर गिना जाता है। इस तरह के संग्रह आमतौर पर समवर्ती मोड विफलता या एक स्पष्ट संग्रह अनुरोध (उदाहरण के लिए, System.gc ()) के कारण होते हैं।

आगे नीचे एक मार्ग के साथ संयोजन के रूप में

आरबीआई द्वारा वितरित कचरा संग्रह (डीजीसी) के साथ स्पष्ट कचरा संग्रह के सबसे अधिक उपयोग किए जाने वाले उपयोगों में से एक होता है। RMI का उपयोग करने वाले अनुप्रयोग अन्य आभासी मशीनों में वस्तुओं को संदर्भित करते हैं। कचरा कभी-कभी स्थानीय ढेर को इकट्ठा किए बिना इन वितरित अनुप्रयोगों में एकत्र नहीं किया जा सकता है, इसलिए आरएमआई समय-समय पर पूर्ण संग्रह करता है। इन संग्रहों की आवृत्ति को गुणों के साथ नियंत्रित किया जा सकता है। उदाहरण के लिए,

java -Dsun.rmi.dgc.client.gcInterval=3600000

-Dsun.rmi.dgc.server.gcInterval=3600000 एक बार प्रति मिनट की डिफ़ॉल्ट दर के बजाय प्रति घंटे एक बार स्पष्ट संग्रह निर्दिष्ट करता है। हालाँकि, इससे कुछ वस्तुओं को पुनः प्राप्त होने में अधिक समय लग सकता है। डीजीसी गतिविधि की समयबद्धता पर ऊपरी बाध्यता की कोई इच्छा नहीं है, तो इन गुणों को स्पष्ट संग्रह के बीच समय बनाने के लिए Long.MAX_VALUE के रूप में उच्च के रूप में सेट किया जा सकता है।

लगता है कि 98% का निर्धारण करने के लिए मूल्यांकन की अवधि एक मिनट लंबी है, लेकिन यह सही परिभाषित के साथ सूर्य के जेवीएम पर विन्यास योग्य हो सकता है।

बेशक, अन्य व्याख्याएं संभव हैं।


5
आरएमआई वितरित कचरा संग्रह नियमित कचरा संग्रह के लिए एक असंबंधित गतिविधि है। इसलिए मैं यह नहीं देखता कि तुम कैसे समझ सकते हो कि तुमने क्या किया।
स्टीफन सी

2
अनुमान सही या सही नहीं है, इसीलिए "इंप्लीमेंट" के बजाय "इंप्लीमेंट" का उपयोग किया जाता है। यदि आप इस अवलोकन से सहमत हैं कि यदि RMI के लिए कचरा संग्रहण अंतराल का निर्धारण करने में सूर्य से अधिक लोगों ने एक मिनट का उपयोग किया है, तो समवर्ती संग्रह में संग्रह समय की गणना केवल तब की जाती है जब मुख्य कार्यक्रम रुकता है, और विश्वास की एक छलांग लगाता है , तो अच्छा है 98% एक मिनट में एकत्र किया जाता है। यह एक जादू की संख्या है, लेकिन एक मिनट एक जादू की संख्या है जिसका उपयोग अक्सर 3.5 मिनट की तुलना में किया जाता है।
एडविन बक

@StephenC का मतलब यह है कि अगर हम -XX:+DisableExplicitGC इसे सेट करते हैं तो भी यह आरएमआई से संबंधित कॉन्फ़िगरेशन को प्रभावित नहीं करेगा और सिस्टम पैरामीटर के साथ आवृत्ति सेट में जीसी लागू करेगा-Dsun.rmi.dgc.server.gcInterval
स्टीपेन

1
@Steephen - नहीं, मैं यह नहीं कह रहा हूँ। मैं इस कथन के बारे में बात कर रहा हूं: "इसका अर्थ है कि 98% का निर्धारण करने के लिए मूल्यांकन की अवधि एक मिनट लंबी है ..." । और ध्यान दें कि एडविन इस बात से सहमत हैं कि अनुमान "अपूर्ण" है। यह अनुमान इस धारणा पर आधारित है कि जिन लोगों ने आरएमआई (और डीजीसी) को लागू किया था वे जीसी ओवरहेड सीमा तंत्र को लागू करने वाले लोगों के साथ घनिष्ठ संपर्क में थे। मुझे संदेह है कि दो घटनाक्रम वास्तव में अलग-अलग समय पर हुए थे। ध्यान दें कि -Dsun.rmi.dgc.server.gcIntervalसंपत्ति जावा 1.2 के आसपास है।
स्टीफन सी

1
वैसे भी, इस सवाल का असली जवाब खोजने के लिए एक बेहतर दृष्टिकोण OpenJDK स्रोत कोड को देखना होगा।
स्टीफन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.