2012-09-28 13 views
5

नीचे दिए गए कोड को देखते हुए।निजी क्षेत्रों का कचरा संग्रह

class A { 
    private B b; 
    public A() { 
     b = new B(); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     A a = new A(); // two objects are created (a and b) 
     // <-- is B object, referenced only by private a.b eligible for garbage collection? 
     keepAlive(a); 
    } 
} 

क्या बी ऑब्जेक्ट को ऑब्जेक्ट के निर्माण के बाद एकत्रित कचरा हो सकता है?

उत्तर

6

मुझे नहीं लगता, क्योंकि इस क्षेत्र को अभी भी प्रतिबिंब के माध्यम से उपयोग किया जा सकता है (setAccessible(true) का उपयोग करके)।

सैद्धांतिक रूप से, संकलक साबित कर सकते हैं कि इस क्षेत्र को एक्सेस किया जा कभी नहीं होगा, और यह (JLS 12.6.1 Implementing Finalization से) B कचरा संग्रहण के लिए पात्र होगा:

एक पहुंच योग्य वस्तु किसी भी वस्तु है कि किसी भी संभावित में पहुँचा जा सकता है है किसी भी लाइव धागे से निरंतर गणना। किसी प्रोग्राम के रूपांतरणों को अनुकूलित करने के लिए डिज़ाइन किया जा सकता है जो उन वस्तुओं की संख्या को कम करता है जो उन लोगों से कम होने के लिए पहुंच योग्य हैं जिन्हें बेवकूफ़ माना जा सकता है। उदाहरण के लिए, एक कंपाइलर या कोड जेनरेटर एक वेरिएबल या पैरामीटर सेट करने का विकल्प चुन सकता है जिसे अब इस ऑब्जेक्ट के लिए भंडारण को संभावित रूप से पुनः प्राप्त करने के लिए उपयोग करने के लिए उपयोग नहीं किया जाएगा।

लेकिन मुझे नहीं लगता कि अभ्यास संकलनकर्ता और JVMs में है कि स्मार्ट

1

@Kuba तुम्हारा मतलब क्या कर रहे हैं: क्षेत्र वर्ग A के कहने a की b में वर्ग B के कहने कचरा एकत्र किया जा सकता ? नहीं। anull नहीं है क्योंकि ba द्वारा संदर्भित है।

1

नहीं, क्योंकि मुख्य धागे के पास ba के माध्यम से पथ है।

0

मानक कंपाइलर स्मार्ट नहीं है।

class A 
{ 
    private Object[] array; 

    public A() 
    { 
     array = new Object[10000000]; 
    } 
} 

public static void main(String[] args) 
{ 
    LinkedList<A> list = new LinkedList<A>(); 
    while (true) 
    { 
     list.add(new A()); 
    } 
} 

यह कोड बहुत कम लूप के बाद स्मृति अपवाद से बाहर फेंकता है, इसलिए मूल प्रश्न का उत्तर निश्चित रूप से नहीं है।

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