2016-11-02 7 views
9

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

कोई तरीका नहीं दिखता बीन कारखाने या आवेदन संदर्भों (यहां तक ​​कि ताज़ा करने योग्य) पर जो बीन कारखाने के निम्नतम स्तर संदर्भ को हटाने से अधिक करते हैं। नतीजा यह है कि ऐसा लगता है कि यह स्मृति को लीक कर रहा है, और कुछ परिस्थितियों में एक संदर्भ के स्वच्छ पुन: निर्माण को रोकता है।

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

क्या किसी को इस तरह से पता है कि मैं वीएम को पूरी तरह से बंद करने के बिना पूरी तरह से एक संदर्भ और बीन फैक्ट्री को साफ और पूरी तरह से हटा सकता हूं?

उत्तर

0

यदि आप गैर-वेब अनुप्रयोग वातावरण में स्प्रिंग के आईओसी कंटेनर का उपयोग कर रहे हैं; उदाहरण के लिए, एक समृद्ध ग्राहक डेस्कटॉप वातावरण में; आप JVM के साथ शटडाउन हुक पंजीकृत करते हैं। ऐसा करने से एक सुंदर शट डाउन सुनिश्चित होता है और आपके सिंगलटन बीन्स पर प्रासंगिक नष्ट विधियों को कॉल किया जाता है ताकि सभी संसाधन जारी किए जा सकें। बेशक, आपको अभी भी इन नष्ट कॉलबैक को सही तरीके से कॉन्फ़िगर और कार्यान्वित करना होगा।

कोड

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public final class startup { 

    public static void main(final String[] args) throws Exception { 
     AbstractApplicationContext ctx 
      = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); 

     // add a shutdown hook for the above context... 
     ctx.registerShutdownHook(); 

     // app runs here... 

     // main method exits, hook is called prior to the app shutting down... 
    } 
} 
+0

धन्यवाद, लेकिन जैसा कि मैंने उल्लेख किया है कि कुल कंटेनर के बंद होने से कोई लेना देना नहीं है। यह कंटेनर को बंद किए बिना एक एप्लिकेशन संदर्भ का निर्माण/विनाश है, इसलिए शटडाउन हुक मदद नहीं करेगा। – Mike

0

संदर्भ पर कॉल destroy और उदाहरण संदर्भित सभी चर को अशक्त सेट:

बंद हुक रजिस्टर करने के लिए, आप registerShutdownHook() विधि है कि AbstractApplicationContext वर्ग पर घोषित किया जाता है बुलाना चाहिए आपके आवेदन संदर्भ का:

AbstractApplicationContext context = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); 

// ... do your stuff 

context.destroy(); 
context = null; 
+0

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

1

देखने के बाद इस में घ फिर से हाल ही में, मैंने देखा कि मैं संदर्भ यकीन है कि सेम पूरी तरह से नष्ट हो गए थे बनाने के लिए की doClose() विधि अधिभावी गया था, लेकिन बुला नहीं किया गया था super.doClose() विधि, जिसका मतलब था कि LiveBeansView.unregisterApplicationContext()/destroyBeans()/getLifecycleProcessor().onClose() और closeBeanFactory() नहीं बुलाया जा रहा था।

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

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