यह अभी तक एक और है "कृपया मुझे बताएं कि कैसे जावा कचरा कलेक्टर को चलाने के लिए मजबूर करना है" प्रश्न। हमारे आवेदन में, मेरा मानना है कि हमारे पास ऐसा करने के अच्छे कारण हैं।काम करने के सेट के दौरान जावा कचरा कलेक्टर को चलाने के लिए कैसे मनाने के लिए छोटा है?
यह एक सर्वर अनुप्रयोग है, जो आमतौर पर लगभग 5 एम लाइव ऑब्जेक्ट्स होता है। प्रत्येक 5 मिनट में, हम एक विश्लेषण कार्य करते हैं जो ~ 60 सेकंड लेता है। यदि विश्लेषण चल रहा है, तो एक पूर्ण जीसी ट्रिगर किया गया है, तो लगभग 40 एम लाइव ऑब्जेक्ट्स होंगे। जब विश्लेषण पूरा हो जाता है तो अतिरिक्त 35 एम ऑब्जेक्ट कचरा बन जाते हैं। सर्वर हर समय अनुरोधों के लिए उत्तरदायी बने रहना चाहिए (भले ही विश्लेषण चल रहा हो)।
हमने पाया है कि विश्लेषण पूर्ण नहीं होने पर एक पूर्ण जीसी लगभग 1.5 सेकंड लेता है, लेकिन विश्लेषण चल रहा है, जबकि लगभग 15 सेकंड। दुर्भाग्यवश, हमारा आवंटन पैटर्न ऐसा है कि पूर्ण जीसी आमतौर पर विश्लेषण के दौरान ट्रिगर करते हैं, भले ही विश्लेषण केवल 20% समय चल रहा हो। (प्रत्येक तीसरा या चौथा विश्लेषण रन एक पूर्ण जीसी ट्रिगर करता है।)
मैंने विश्लेषण चलाने शुरू करने से पहले बहुत अधिक scorned System.gc() को कॉल करने के लिए कोड जोड़ा, यदि पुरानी पीढ़ी में खाली स्थान निश्चित सीमा से नीचे है (5GB)। लाभ बहुत महत्वपूर्ण था: हमें 15 सेकंड के विराम के समय 1.5 सेकंड पॉज़ टाइम्स मिल रहे हैं, और हम सौदा में अधिक कचरा मुक्त करते हैं। हालांकि, कभी-कभी System.gc() कॉल को अनदेखा कर दिया जाता है, और कुछ मिनट बाद जब हम स्वचालित रूप से जीसी ट्रिगर होता है तो हम 15-सेकंड रोकते हैं।
मेरा प्रश्न, तो: क्या कुछ ऐसा है जो हम कचरा कलेक्टर को चलाने के लिए दृढ़ता से मनाने के लिए कर सकते हैं? हम 1.7.0_0 9-आईसीएडीटीए चला रहे हैं और समांतर जीसी का उपयोग कर रहे हैं। मैं या तो (ए) कचरा संग्रह को मैन्युअल रूप से मजबूर करने के लिए एक विश्वसनीय तरीका चाहता हूं, या (बी) संग्राहक को ट्यून करने का कोई तरीका है ताकि यह एक अधिक बुद्धिमान स्वचालित निर्णय ले सके। (बी) मुश्किल लगता है, क्योंकि यह मुझे स्पष्ट नहीं है कि कलेक्टर कैसे पता लगा सकता है कि हमारा कामकाजी सेट इस नाटकीय फैशन में भिन्न होता है।
यदि आवश्यक हो तो मैं पर्याप्त हैकरी का सहारा लेना चाहता हूं; यह हमारे लिए एक गंभीर मुद्दा है। (हम सीएमएस या जी 1 कॉम्पैक्टरों को विकल्पों के रूप में देख सकते हैं, लेकिन मैं सीएमएस के थ्रूपुट प्रभाव को कम कर रहा हूं, और जी 1 बड़े बाइट एरे के चेहरे पर खराब व्यवहार करने के लिए प्रतिष्ठित है, जिसका हम उपयोग करते हैं।)
addendum: उत्पादन में, अब तक हमारा अनुभव रहा है कि System.gc() आमतौर पर एक पूर्ण कचरा संग्रह ट्रिगर करता है; कम से कम, उन परिस्थितियों में जहां हम इसे बुला रहे हैं। (हम केवल 10 से 30 मिनट में इसे एक बार कहते हैं, ढेर के साथ कुछ हद तक पूरी तरह से कचरे से भरा नहीं है।) कचरा संग्रह को अधिक विश्वसनीय रूप से ट्रिगर करने में सक्षम होना अच्छा होगा, लेकिन यह हमें ज्यादातर समय में मदद कर रहा है।
आपने स्पष्ट रूप से अपना शोध किया है! मुझे आशा है कि आपको एक अच्छा जवाब मिलेगा; मैं इसके बारे में और जानने के लिए उत्सुक हूँ! – templatetypedef
मैंने अक्सर इस बारे में सोचा है - वहां * कचरा संग्रह को मजबूर करने के वैध कारण हैं, हालांकि वे बहुत दुर्लभ प्रतीत होते हैं। शायद इसमें एक जीसी हुक के साथ एक विशेष जेवीएम की जरूरत है। – arcy
क्या आपने केवल ढेर को छोटा करने की कोशिश की है? –