11

यहां मेरा उपयोग केस है। हम किसी एप्लिकेशन में संभावित मेमोरी रिसाव को कम करने की कोशिश कर रहे हैं, और हम ढेर को स्नैपशॉट करने के लिए मेमोरी विश्लेषण टूल का उपयोग कर रहे हैं ताकि हम ऑब्जेक्ट इंस्टेंस और संदर्भों को देख सकें। (यदि यह मदद करता है, तो हम आपकीकिट का उपयोग कर रहे हैं।)जावा में जीसीडी होने के लिए कमजोर और/या नरम संदर्भित वस्तुओं को फोर्स करने का कोई तरीका है?

यह एप्लिकेशन गतिशील और सीजीआईएलबी प्रॉक्सी का व्यापक उपयोग करता है, जो वीकशैश मैप्स में कक्षाओं और क्लासलोडरों के संदर्भों के टन को संग्रहीत करता है।

हमारे परीक्षण मामले के बाद, हम एक्स और उसके क्लासलोडर को ऑब्जेक्ट करने के लिए सभी कठिन संदर्भों की उम्मीद कर रहे हैं, लेकिन अंत में परीक्षण मामले में शामिल कई प्रॉक्सी हमारे पास बहुत कमजोर/मुलायम संदर्भ शेष हैं । (मुझे केवल वीक हैशैप मैप संदर्भ मिल सकते हैं, लेकिन आपकीकिट सारांश में एक पंक्ति वस्तु में कमजोर और नरम संदर्भ दोनों को लपेटती है, इसलिए मुझे यकीन नहीं है कि मुझे कहीं नरम संदर्भ नहीं मिल रहा है।)

यह भी सच है जेवीएम से एक पूर्ण जीसी का अनुरोध। (सर्वर मोड में सूरज 1.6.0_23 JDK का उपयोग करना।)

यह लगता मानो JVM मानते हैं वहाँ केवल कमजोर/इन वस्तुओं के लिए नरम संदर्भ हैं, लेकिन मैं इसे करने के लिए इन बातों को जीसी के लिए नहीं मजबूर कर सकते हैं 100% सुनिश्चित हो। (इसलिए, मैं चाहता हूं कि यह पूरी तरह ढेर से और गायब से इसके क्लासलोडर उपयोग को गायब करने के लिए गायब हो जाए।)

किसी को भी ऑब्जेक्ट को निपटाने के लिए जेवीएम को कॉन्फ़िगर करने और/या मजबूर करने का तरीका पता है/कमजोर संदर्भित?

+0

क्या आपने अपनी वस्तुओं को किसी भी मौके से वैश्विक घटनाओं में पंजीकृत किया था? शायद एक स्थैतिक क्षेत्र (या कोई अन्य धागा वस्तु या कुछ और) उनके लिए एक संदर्भ है ... – Mehrdad

+0

अच्छा सवाल - पहले से ही इसमें देखा गया था और आपकी किट इस तरह की चीजों को जल्दी से खोजने के लिए पर्याप्त जानकारी प्रदान करता है। जबकि मैं अभी भी जांच कर रहा हूं, अब तक मैंने इसे डाउन (मुझे लगता है) स्प्रिंग के एओपी द्वारा शुरू किए गए कुछ व्यवहारों को संकुचित कर दिया है जब यह RegexpMethodPointcutAdvisor का उपयोग करके कक्षाओं/विधियों को प्रॉक्सी करता है। हालांकि, यह सलाहकार का केवल एक विशेष मामला है (अब तक) - हम इसे कई स्थानों पर उपयोग करते हैं जो इस समस्या को उत्पन्न नहीं कर रहे हैं। अभी भी एक मामले के बारे में अद्वितीय क्या है यह पहचानने पर काम कर रहा है ... मेरे पास और अधिक होने पर वापस पोस्ट करेगा। – Scott

+0

ठीक है, तो यहां अद्यतन है। मेरा मानना ​​है कि मुझे अपने विशेष मुद्दे के लिए धूम्रपान बंदूक मिली है। हमारे आवेदन में प्रयुक्त प्रॉक्सी में से एक को कैश से जरूरी होने पर इसके क्रियान्वयन को आलसी लोड करता है ताकि यह सुनिश्चित किया जा सके कि ऑपरेशन हमेशा हाल ही में कैश किए गए ऑब्जेक्ट पर होता है। यदि कैश में ऑब्जेक्ट नहीं है, तो कैश को ऑब्जेक्ट को तत्काल और प्रारंभ करने के लिए कॉन्फ़िगर किया गया है। प्रॉक्सी एक बदमाश प्रॉक्सी है कि किसी भी विधि के आमंत्रण के लिए, यह ऑब्जेक्ट के लिए कैश पूछता है, फिर ऑब्जेक्ट पर विधि को आमंत्रित करता है। टिप्पणियों में एक चार सीमा है, इसलिए पढ़ें ... – Scott

उत्तर

10

कॉलिंग जीसी हमेशा सभी कमजोर पहुंचने योग्य वस्तुओं को जारी करना चाहिए (मानते हैं कि System.gc पर कॉल करके "अनुरोध" वास्तव में दिया जाता है)। यदि जीसी द्वारा कमजोर संदर्भों को मंजूरी नहीं मिल रही है, तो इसका मतलब है कि वस्तुएं कम से कम नरम पहुंच योग्य हैं।

मुलायम संदर्भ साफ़ करना मुश्किल है, क्योंकि यह JVM के विवेकानुसार है। धीरे-धीरे पहुंचने योग्य वस्तुओं की समाशोधन की गारंटी देने का एकमात्र तरीका OutOfMemoryError को फेंकने का कारण बनना है। यह चाल this discussion में प्रदर्शित की गई है।

+1

'system.gc' केवल एक संकेत नहीं है?और इसलिए सवाल "नहीं" का जवाब नहीं है? – nmr

+1

मुझे आश्चर्य है कि यह Dalvik/ART पर काम करता है – nmr