2010-03-31 18 views
5

मैं एक कस्टम क्लास लोडर का उपयोग कर रहा हूं जो URLClassLoader को बढ़ाता है। मैं अपने क्लास क्लास लोडर में कुछ कक्षाएं लोड करता हूं और कुछ कार्य करता हूं। एक बार कार्य पूरा हो जाने के बाद मैं कक्षा लोडर का निपटान करना चाहता हूं। मैंने शून्य के संदर्भ को सेट करके ऐसा करने की कोशिश की।एक वर्ग लोडर का निपटान

लेकिन यह कचरा वर्ग लोडर एकत्र नहीं करता है।

क्या कोई ऐसा तरीका है जो मैं प्राप्त करना चाहता हूं?

+0

देखें http://stackoverflow.com/questions/148681/unloading-classes-in-java/148707#148707 –

+0

एक ही प्रश्न _quite_ नहीं, यह लोड वर्गों की बजाय क्लासलोडर को उतारने के बारे में है। –

+1

मेरी पहली सलाह यह जांचना होगा कि आपकी कक्षाओं को आपके क्लासलोडर के अंदर कचरा नहीं है। एक डंप बनाएं और निर्भरता का विश्लेषण अपने क्लासलोडर द्वारा आयोजित कक्षाओं में करें। –

उत्तर

2

ClassLoader doc: Every Class object contains a reference to the ClassLoader that defined it से। यह आपके लोडर को एकत्रित करने से रोक रहा है। आपको उन वर्गों के वर्गों और उदाहरणों के सभी संदर्भों को भी हटाना होगा।

3

असल में, जैसा कि @invariant ने पहले से ही बताया है, विशिष्ट क्लासलोडर द्वारा लोड किए गए सभी वर्गों को संदर्भित करना उस क्लासलोडर कचरा को एकत्रित करना चाहिए। हालांकि, (कम से कम) एक अपवाद है: यदि कक्षा को क्रमबद्ध किया जाता है, तो उस वर्ग (और इस प्रकार इसका क्लासलोडर) ObjectStreamClass द्वारा आंतरिक रूप से संदर्भित रखा जाता है, जो एक प्राथमिक वर्ग है और इसलिए कभी कचरा एकत्र नहीं किया जाता है। तो इस मामले में, क्लासलोडर कचरा नहीं हो सकता है जब तक कि पूरे JVM समाप्त नहीं हो जाता है।

"कचरा संग्रह और क्रमबद्धता से संबंधित समस्याओं" खंड में पूर्ण स्पष्टीकरण here देखें।

0

जब तक इस श्रेणी के लोडर द्वारा लोड की गई किसी भी कक्षा का संदर्भ दिया जाता है, तो क्लासलोडर कचरा-एकत्र नहीं किया जाएगा। तो क्लासलोडर को हटा दिया जाएगा यदि: क्लासलोडर के सभी प्रत्यक्ष संदर्भों को हटा दिया गया है, इस क्लासलोडर द्वारा लोड की गई कक्षाओं के सभी संदर्भ और इन कक्षाओं के उदाहरणों के लिए। फिर इसे कचरा-कलेक्टर के अगले भाग पर डंप किया जा सकता है।

1

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

यह अब fixed in JDK 7 है जो URLClassLoader.close() विधि जोड़ता है।

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