2012-02-28 28 views
5

"जारी" द्वारा मेरा मतलब है कि क्लासलोडर शेष के लिए कोई संदर्भ नहीं है।जब क्लासलोडर जारी किया जाता है तो सिंगलेट्स पर अंतिम रूप दिया जाता है?

हम ऐसी समस्या में भाग रहे हैं जहां अक्सर-पुन: नियोजित जावा ईई एप्लिकेशन परमजन स्पेस खा जाता है। विश्लेषण से पता चलता है कि जावा ईई ऐप में एक सिंगल ने एप्लिकेशन के बाहर एप्लिकेशन-क्लासलोडर ऑब्जेक्ट्स (जावा ईई नियमों के उल्लंघन में) के संदर्भ पारित किए हैं और ऐप बेरोजगार होने पर उन्हें साफ़ नहीं कर रहा है।

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

मुख्य प्रश्न यहाँ शायद है:

एक वर्ग वस्तु इस मामले जहां इसकी classloader अभी तक नहीं किया जा सकता में कचरा-एकत्र हो जाएगा? यह क्लासलोडर व्यवहार के विनिर्देश पर निर्भर हो सकता है, या कार्यान्वयन-निर्भर हो सकता है।

संदर्भ (अन्य प्रकार! ;-)) की सराहना की जाएगी, लेकिन आवश्यक नहीं है।

+0

आप WeakReference (रों) और WeakHashMap का उपयोग कर विचार मजबूत (नियमित) संदर्भ के बजाय ClassLoaders के संदर्भ पार कर लेते हैं। – Stefan

उत्तर

4

इसके लिए एक स्थिर संदर्भ वाला एक वर्ग, केवल कचरा संग्रह के लिए योग्य होगा, यदि वर्ग लोडर जीसीइंग के लिए योग्य है और इसके कोई अन्य संदर्भ नहीं हैं।

एक वर्ग या इंटरफ़ेस को अनलोड किया जा सकता है यदि केवल और यदि परिभाषित वर्ग लोडर को कचरा कलेक्टर द्वारा पुनः दावा किया जा सकता है।

http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

इसके अलावा हर वर्ग अपनी classloader के लिए एक संदर्भ है। तो एक वर्ग लोडर जीसीइंग के लिए योग्य नहीं है जब तक कि इसके द्वारा लोड की गई कक्षाओं या गैर संग्रहणीय वस्तुओं से उन वर्गों की वस्तुओं के संदर्भ न हों।

ऑब्जेक्ट कचरा संग्रह के लिए योग्य होने के बाद और वास्तविक जीसी होने से पहले कुछ समय बाद फाइनलर चलाया जाता है।

अंतिम आने वाले संदर्भों को मुक्त करने का दृष्टिकोण, जो अंतिम रूप में जीसीइंग को रोकता है, काम नहीं करता है। फाइनल को तब तक नहीं कहा जाएगा जब तक कि ऐसे संदर्भ मौजूद न हों क्योंकि वे ऑब्जेक्ट को कचरा संग्रहण के योग्य होने से रोकते हैं।उदाहरण के लिए आप अंदर से इस संदर्भ श्रृंखला नहीं तोड़ सकते हैं:

singleton instance <--- singleton class <--- class loader <-- 
<-- any class loaded by that class loader <-- any object of such a class 
<-- object loaded by another classloader referencing such an object or class 
+0

संदर्भ सिंगलटन (प्रत्यक्ष या परोक्ष रूप से) नहीं हैं, ताकि संदर्भ लूप कोई समस्या न हो। मुख्य बात यह है कि मैं समझने की कोशिश कर रहा हूं कि अगर कक्षा को जीसीडी किया जा सकता है, भले ही इस रिलीज क्लासलोडर के अन्य वर्गों के लिए बाहरी संदर्भ बकाया हों। –

+0

"रिलीज़" से आपका क्या मतलब है। एक वर्ग लोडर केवल जीसीइंग के लिए योग्य हो जाता है, यदि उसके द्वारा लोड किए गए सभी वर्ग भी जीसीइंग के लिए पात्र हैं क्योंकि प्रत्येक वर्ग के पास इसके क्लासलोडर का संदर्भ है। –

+0

ठीक है, और क्लासलोडर के पास सभी वर्गों का एक वेक्टर है जो लोड हो गया है ... इसलिए अंतिमकर्ता काम नहीं करेगा। बहुत धन्यवाद! –

0

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

वैसे भी, (राज्यव्यापी) सिंगलेट का उपयोग न करें।

+0

क्या इस वर्ग में एक वर्ग वस्तु कचरा-एकत्रित होगी जहां इसका क्लासलोडर अभी तक नहीं हो सकता है? यह या तो क्लासलोडर व्यवहार के विनिर्देश पर निर्भर है, या कार्यान्वयन-निर्भर हो सकता है। –

+0

@EdStaub - एक वर्ग तब तक एकत्र नहीं किया जाता जब तक कि इसके क्लासलोडर को एकत्र नहीं किया जा सके। और एक क्लासलोडर तब तक एकत्र नहीं किया जाता है जब तक कि लोड किए गए सभी वर्गों को एकत्र नहीं किया जा सके। –

+0

और स्थिर संदर्भ अभी भी पहुंच योग्य हैं जबकि कक्षा पहुंच योग्य है। "दिलचस्प बात यह है कि, टोमकैट स्थिर क्षेत्रों को हटा देगा। –

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

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