2009-01-17 20 views
75

एक काल्पनिक उपयोगिता वर्ग है कि केवल कार्यक्रम सेटअप में प्रयोग किया जाता है को देखते हुए:कचरे के संग्रह के लिए स्थिर क्षेत्र खुले हैं?

class MyUtils { 
    private static MyObject myObject = new MyObject(); 
    /*package*/static boolean doStuff(Params... params) { 
     // do stuff with myObject and params... 
    } 
} 

myObject कचरा एकत्र किया जाएगा जब यह अब किया जा रहा है, या यह कार्यक्रम के जीवन के लिए रहेंगे?

उत्तर

93

कक्षा लोड होने के दौरान स्थिर चर को कचरा संग्रह के लिए निर्वाचित नहीं किया जा सकता है। जब वे संबंधित वर्ग लोडर (जो इस वर्ग को लोड करने के लिए ज़िम्मेदार थे) को कचरा के लिए एकत्र किया जाता है तो उन्हें एकत्र किया जा सकता है।

चेक बाहर JLS Section 12.7 Unloading of Classes and Interfaces

एक वर्ग या इंटरफ़ेस उतार दिया जा सकता है अगर और सिर्फ़ अगर इसकी परिभाषित वर्ग लोडर कचरा कलेक्टर द्वारा पुन: दावा किया जा सकता है [...] वर्ग और इंटरफेस द्वारा लोड बूटस्ट्रैप लोडर अनलोड नहीं हो सकता है।

+0

लिंक टूटा हुआ है। – starblue

+0

@bruno, आपके लिंक के अनुसार, क्या इसका मतलब यह है कि एक वर्ग लोडर प्रत्येक लोड के प्रत्येक वर्ग का संदर्भ रखता है, भले ही वर्ग लोड में स्थिर सदस्य न हों? – Pacerier

+0

@Pacerier, हां। –

6

मुझे लगता है कि this आपके प्रश्न का उत्तर देता है - मूल रूप से जब तक कक्षा एक विशेष श्रेणी लोडर से नहीं आती है और वह कक्षा को उतारती है।

+2

या जब तक कोई स्थिर क्षेत्र अपडेट नहीं करता है। –

+0

दरअसल - यह अंतिम – Tom

42

स्टेटिक वेरिएबल्स क्लास ऑब्जेक्ट्स द्वारा संदर्भित हैं जिन्हें क्लासलोडर्स द्वारा संदर्भित किया जाता है- इसलिए जब तक क्लासलोडर क्लास को किसी भी तरह से छोड़ देता है (यदि यह भी संभव है) या क्लासलोडर स्वयं संग्रह के लिए योग्य हो जाता है (अधिक संभावना है - वेबप्ल को उतारने के बारे में सोचें) स्थैतिक चर (या बल्कि, वे संदर्भित वस्तुओं) एकत्र नहीं किया जाएगा।

+1

चिह्नित नहीं है 'कक्षा' ऑब्जेक्ट्स जिनमें कोई स्थैतिक चर नहीं है, उनके वर्ग लोडर द्वारा संदर्भित किया जाता है? – Pacerier

13

यदि आप स्थिर प्रारंभिकरण के लिए एक अस्थायी वस्तु का उपयोग करना चाहते हैं तो इसका निपटारा किया गया है, आप एक स्थिर प्रारंभिक ब्लॉक का उपयोग कर सकते हैं, उदा।

class MyUtils { 
    static 
    { 
     MyObject myObject = new MyObject(); 
     doStuff(myObject, params); 
    } 

    static boolean doStuff(MyObject myObject, Params... params) { 
     // do stuff with myObject and params... 
    } 
} 

के बाद से स्थिर initialiser ब्लॉक स्थिर विधि का एक विशेष प्रकार का है, myObject एक स्थानीय चर रहा है और कचरा एकत्र करने के बाद ब्लॉक निष्पादित नहीं हो हो सकता है।

+3

यह सवाल का जवाब नहीं देता ..... – Pacerier

8

myObject संदर्भ और ऑब्जेक्ट नहीं है। कोई ऑब्जेक्ट स्वचालित रूप से कचरा इकट्ठा होता है जब कोई संदर्भ इंगित करता है क्योंकि यह पहुंच योग्य नहीं है।

तो भी एक स्थिर संदर्भ "myObject" पीछे वस्तु

myObject = null; 

साथ अगर आप इसे भिन्नता कचरा एकत्र किया जा सकता है और वहाँ इस वस्तु के लिए कोई अन्य संदर्भ हैं।

हालांकि स्थिर संदर्भ और चर आपके कार्यक्रम के जीवनकाल के लिए बने रहते हैं।

+0

StackOverflow में आपका स्वागत है! 'स्थिर ब्लॉक 'के अंत में ऑब्जेक्ट को' शून्य 'पर सेट करना एक व्यवहार्य विकल्प है। मेरे मामले में, हालांकि, वस्तु के जीवनकाल को स्थैतिक ब्लॉक से अधिक समय की आवश्यकता होती है। वस्तु का अंत-उपयोग उपयोगी नहीं था; इस प्रकार मैं कचरा कलेक्टर का उपयोग करने के बारे में पूछता हूं। –