हम जावा अनुप्रयोग "कंटेनर" में एकाधिक उप-अनुप्रयोगों में लोड करने के लिए एकाधिक बाल वर्गीकरण बना रहे हैं, हॉट तैनाती प्रोटोटाइपिंग। जब किसी विशेष क्लासलोडर का क्लासपाथ बदल गया है (यानी जार जोड़े गए हैं, हटाए गए हैं, अपडेट किए गए हैं), पुराने क्लासलोडर को फेंक दिया गया है (बिना संदर्भित) और जार के नए क्लासपाथ के लिए एक नया क्लासलोडर बनाया गया है।एक कबूतर संग्रह के लिए जावा क्लासलोडर कब और कैसे चिह्नित किया जाता है?
क्लासपाथ को अद्यतन करने के बाद, गर्म तैनाती को ट्रिगर करने के बाद, हमने एक ढेर डंप लिया। हीप डंप (मेमोरी विश्लेषक का उपयोग करके) इंगित करता है कि पुराने क्लासलोडर को कचरा नहीं मिला था। पैरेंट क्लासलोडर में कुछ कक्षाएं पुराने क्लासलोडर को कैश कर रही थीं। निम्नलिखित बातें इन कैश साफ़ करने के लिए लागू किया गया:
java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
यहां तक कि ऊपर कैश साफ़ करने के बाद, वर्ष classloader अभी भी कचरा एकत्र नहीं किया जा रहा था। classloader करने के लिए शेष संदर्भ निम्नलिखित शामिल हैं:
- classloader द्वारा लोड कक्षाएं
- java.lang.Package के classloader खुद के द्वारा बनाई गई
- java.lang.ProtectionDomain classloader ही द्वारा बनाई गई
उपरोक्त सभी क्लासलोडर के भीतर परिपत्र संदर्भ हैं, जो कचरा संग्रह को ट्रिगर करना चाहिए। मुझे यकीन नहीं है कि यह क्यों नहीं है। क्या किसी को पता है कि क्यों पुराने क्लासलोडर अभी भी परिपत्र संदर्भों के साथ कचरा नहीं जा रहे हैं?
आप किस जेवीएम का उपयोग करते हैं (सटीक संस्करण)? क्या आप किसी भी JVM विकल्प का उपयोग करते हैं, जो क्लासलोडिंग को प्रभावित कर सकता है? क्या आप सूर्य के अपने कार्यान्वयन से किसी भी सामान का उपयोग करते हैं? क्या आवेदन बाइट कोड में हेरफेर करता है? ... पर्यावरण क्या है, जो वर्ग लोडिंग को प्रभावित कर सकता है? – cafebabe
आपके मुख्य प्रश्न से संबंधित नहीं है, लेकिन क्या आपने अपने स्वयं के ढांचे को करने के बजाय ओएसजीआई की तरह कुछ विचार किया है जो गर्म तैनाती का समर्थन करता है? – SteveD
@bfoo हमारे परीक्षणों में, हम जावा 6 का उपयोग कर रहे हैं। कोई JVM विकल्प नहीं।हम सबसे सरल मामले में सूर्य के प्रभाव का उपयोग नहीं कर रहे हैं। कोई बाइट कोड मैनिपुलेशन नहीं। – onejigtwojig