2009-04-27 18 views
37

0 "अलगाव का द्वीप" कचरा संग्रह के अलगाव के द्वीप की व्याख्या को समझा सकता है?कचरा संग्रह

उत्तर

37

ऑब्जेक्ट एक संदर्भ ऑब्जेक्ट बी ऑब्जेक्ट बी संदर्भ ऑब्जेक्ट A. न तो ऑब्जेक्ट ए और न ही ऑब्जेक्ट बी किसी अन्य ऑब्जेक्ट द्वारा संदर्भित है। यह अलगाव का एक द्वीप है।

असल में, अलगाव का एक द्वीप वस्तुओं का एक समूह है जो एक-दूसरे को संदर्भित करता है लेकिन उन्हें आवेदन में किसी भी सक्रिय वस्तु द्वारा संदर्भित नहीं किया जाता है। कड़ाई से बोलते हुए, यहां तक ​​कि एक एकल संदर्भित वस्तु भी अलगाव का एक द्वीप है। टिप्पणी से

संपादित करें:

class A { 
    B myB; 
} 
class B { 
    A myA; 
} 

/* later */ 
A a = new A(); 
B b = new B(); 
a.b = b; 
b.a = a; 
+0

यह पोस्ट शायद पुराना है।लेकिन मेरा सवाल यह है कि मेरा प्रश्न किड्डी हो सकता है लेकिन जब आप ऑब्जेक्ट ए संदर्भ ऑब्जेक्ट बी कहते हैं। ऑब्जेक्ट बी संदर्भ ऑब्जेक्ट ए। क्या आपका मतलब यह है कि ए = बी; बी बी = ए? – user962206

+5

@ user962206 नहीं उसका मतलब है 'कक्षा ए {बी myB; } कक्षा बी {ए मायए; }/* बाद में */ए ए = नया ए(); बी बी = नया बी(); ए.बी = बी; बी.ए = ए; 'यदि आप इसे समझ सकते हैं ... लेकिन सभी ईमानदारी में,' कक्षा ए {बी myB; } कक्षा बी {} बी बी = नया बी(); ए = नया ए(); ए.बी = बी; ' – corsiKa

9

यहां इस शब्द का good explanation है। अंश:

  • "एक वस्तु obj1 कचरा एकत्र किया जाता है, लेकिन एक और वस्तु obj2 यह करने के लिए एक संदर्भ है, तो obj2 भी कचरा संग्रह के लिए योग्य है तो"
  • "वस्तु obj2 का उपयोग कर सकते हैं कि obj1 वस्तु कचरा संग्रह के लिए पात्र है, तो obj2 भी कचरा संग्रहण के लिए पात्र कि "

यह कहा जाता है" अलगाव के द्वीप "। एक "अलगाव का द्वीप" एक का वर्णन करता है या एप्लिकेशन के सक्रिय हिस्सों से अधिक ऑब्जेक्ट्स का कोई संदर्भ नहीं है।

8

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

2

वास्तव में, यदि आप मार्क की अवधारणा और कचरा संग्रहण की स्वीप समझते हैं, तो आप बेहतर भी समझ जाएंगे कि अलगाव की द्वीप:

  • एल्गोरिथ्म जीसी जड़ों से शुरू होता है: मुख्य थ्रेड, में स्थानीय चर मुख्य विधि, मुख्य वर्ग के स्थिर चर।
  • एल्गोरिदम जीसी जड़ों से शुरू होने वाले सभी ऑब्जेक्ट संदर्भों को पार करता है, और प्रत्येक ऑब्जेक्ट को जीवित के रूप में चिह्नित करता है।
  • चिह्नित ढेर द्वारा कब्जा नहीं किया गया सभी ढेर स्मृति पुनः दावा किया जाता है। इसे आसानी से मुक्त किया जाता है, अनिवार्य रूप से अप्रयुक्त वस्तुओं से मुक्त हो जाता है।
  • यदि दो या दो से अधिक वस्तुएं एक दूसरे का संदर्भ दे रही हैं लेकिन उन्हें किसी रूट से जुड़े ऑब्जेक्ट्स द्वारा संदर्भित नहीं किया जाता है, तो वे अलगाव द्वीप में हैं, और वे भी बह गए हैं।अलगाव की
0

द्वीप:

  1. वस्तु 1 संदर्भ वस्तु 2 और वस्तु 2 संदर्भ 1. वस्तु न तो वस्तु 1 और न ही वस्तु 2 किसी अन्य वस्तु द्वारा संदर्भित है। यह अलगाव का एक द्वीप है।
  2. असल में, अलगाव का एक द्वीप वस्तुओं का एक समूह है जो एक-दूसरे का संदर्भ देता है लेकिन उन्हें एप्लिकेशन में किसी भी सक्रिय ऑब्जेक्ट द्वारा संदर्भित नहीं किया जाता है। कड़ाई से बोलते हुए, यहां तक ​​कि एक भी असुरक्षित वस्तु भी अलगाव का एक द्वीप है।

उदाहरण:

public class Test 
{ 
    Test i; 
    public static void main(String[] args) 
    { 
     Test t1 = new Test(); 
     Test t2 = new Test(); 

     // Object of t1 gets a copy of t2 
     t1.i = t2; 

     // Object of t2 gets a copy of t1 
     t2.i = t1; 

     // Till now no object eligible 
     // for garbage collection 
     t1 = null; 

     //now two objects are eligible for 
     // garbage collection 
     t2 = null; 

     // calling garbage collector 
     System.gc(); 

    } 

    @Override 
    protected void finalize() throws Throwable 
    { 
     System.out.println("Finalize method called"); 
    } 
} 

आउटपुट:

  • अंतिम रूप विधि
  • अंतिम रूप विधि कहा जाता है कहा जाता है

स्पष्टीकरण:

  • एक वस्तु destructing से पहले, कचरा कलेक्टर कॉल उस वस्तु पर सबसे एक समय में विधि को अंतिम रूप देने।

  • कारण को अंतिम रूप देने विधि ऊपर के उदाहरण में दो बार कहा जाता है क्योंकि दो वस्तुओं कचरा collection.This के लिए पात्र हैं इसलिए है क्योंकि हम के बाद को क्रियान्वित करने t2 = अशक्त t1 और t2 वस्तुओं के लिए किसी भी बाहरी संदर्भ नहीं है ।

  • हमारे पास केवल एक दूसरे के लिए आंतरिक संदर्भ हैं (जो कि उदाहरण के लिए कक्षा टेस्ट के हैं)। ऐसा कोई तरीका नहीं है कि हम दोनों ऑब्जेक्ट्स के इंस्टेंस वैरिएबल को कॉल कर सकें। इसलिए, कोई भी वस्तु को फिर से बुलाया जा सकता है।

तक t2.i = t1 : दोनों वस्तुओं बाहरी संदर्भ t1 और t2 है। enter image description here

t1 = बातिल: दोनों वस्तुओं क्रमशः t2.i और t2 के माध्यम से पहुंचा जा सकता है। enter image description here

t2 = बातिल: कोई रास्ता वस्तुओं में से किसी तक पहुँचने के लिए। enter image description here

अब, दोनों वस्तुएं के रूप में कचरा संग्रह के लिए योग्य हैं, हम उन्हें कॉल करने का कोई तरीका नहीं है।:)

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