2010-04-06 15 views
15

मान लीजिए कि मेरे पास एक कार के लिए एक कमजोर संदर्भ है जिसमें इंजन के लिए सामान्य (मजबूत) संदर्भ है। कार या इंजन के लिए कोई अन्य संदर्भ मौजूद नहीं है। क्या इंजन कचरा इकट्ठा किया जा सकता है?एक नेस्टेड मजबूत संदर्भ युक्त वस्तु के कमजोर संदर्भ, और कचरा संग्रह

उत्तर

17

हां यह कर सकता है, यह ठीक है कि weak references को काम करने के लिए डिज़ाइन किया गया है। कमजोर संदर्भ यह है कि आपके ऑब्जेक्ट में एप्लिकेशन है, भले ही ऑब्जेक्ट में अन्य मजबूत संदर्भ हो सकते हैं, यह रूट संदर्भ है जो महत्वपूर्ण है और रूट संदर्भ एक कमजोर संदर्भ है क्योंकि ऑब्जेक्ट कचरा संग्रह के लिए उम्मीदवार होगा ।

अधिक जानकारी के लिए WeakReference वर्ग दस्तावेज़ देखें:

कमजोर संदर्भ वस्तुओं, जो न finalizable बनाया जा रहा है, को अंतिम रूप दिया से उनके referents रोक सकता हूं, और उसके बाद पुन: दावा। कमजोर संदर्भ सबसे अधिक हैं जो अक्सर मैपिंग्स को कैनोनिकल बनाने के लिए उपयोग किए जाते हैं।

मान लीजिए कि कचरा कलेक्टर समय में एक निश्चित बिंदु पर निर्धारित करता है कि एक वस्तु कमजोर पहुंच योग्य है। पर उस समय कहीं भी होगी कि वस्तु के लिए सभी atomically स्पष्ट कमजोर संदर्भ और किसी भी अन्य कमजोर-पहुंच योग्य वस्तुओं से दूर कि वस्तु मजबूत और नरम संदर्भ उपस्थित श्रृंखला के माध्यम से पहुंचा जा सकता है करने के लिए सभी कमजोर संदर्भ। साथ ही यह सभी पूर्व कमजोर पहुंचने योग्य वस्तुओं को अंतिम घोषित करने की घोषणा करेगा। एक ही समय में या पर कुछ समय बाद यह नए-साफ़ कमजोर संदर्भों को एनक्यू करेगा जो संदर्भ पंक्तियों के साथ पंजीकृत हैं। SoftReference और PhantomReference:

FYI करें, WeakReference के साथ साथ, जावा Reference के दो अन्य उपवर्गों प्रदान करता है।

+0

मैंने अभिव्यक्ति को कमजोर संदर्भ कभी नहीं सुना है और ऐसा लगता है जैसे यह कुछ मस्तिष्कवाद का तात्पर्य है। अगर मैं चीजों को सही तरीके से समझता हूं, तो सवाल यह है कि क्या कार गाड़ी का जिक्र कर रही है तो इंजन कचरा इकट्ठा होगा? –

+1

@ जेम्स पी .: वीक रेफरेंस जावा मानक एपीआई में एक वर्ग है जो वास्तव में एक विशेष तंत्र प्रदान करता है, यानी संदर्भ जो किसी ऑब्जेक्ट को कचरा संग्रह के योग्य होने से नहीं रोकते हैं। –

1

यहां एक यूनिट परीक्षण है जो कमजोर संदर्भ प्रदर्शित करता है। ध्यान दें कि System.gc() गारंटी नहीं देगा कि ऑब्जेक्ट को कचरा इकट्ठा किया जाएगा और आपको उस पर भरोसा नहीं करना चाहिए।

import junit.framework.TestCase; 

import java.lang.ref.WeakReference; 

public class WeakReferenceTest extends TestCase { 


    class Car { 

     Engine engine = new Engine(); 

    } 

    class Engine { 

    } 

    public void testWeakReferences() { 
     WeakReference<Car> carRef = new WeakReference<Car>(new Car()); 
     assertNotNull(carRef.get()); 
     System.gc(); 
     assertNull(carRef.get()); 
    } 

} 
+0

नोटेशन WeakReference वास्तव में क्या मतलब है? –

+8

System.gc() को कॉल करने की गारंटी नहीं है कि अंतिम जोर सही हो जाएगा। – Phil

+0

यह जेनेरिक क्लास 'वीक रेफरेंस ' का पैरामीटरकरण है जिसमें टाइप पैरामीटर 'टी' कक्षा' कार' है। –

8

कार उदाहरण कचरा एकत्र किया जा सकता है, लेकिन कोई गारंटी नहीं है कि यह अगले जीसी चक्र, या यहाँ तक कि यह बिल्कुल एकत्र किया जाएगा पर कचरा एकत्र किया जाएगा है। उदाहरण के लिए,

  • जीसी रन से पहले कुछ समय के लिए, आवेदन WeakReference पर get फोन और (उदाहरण के लिए) कुछ ही पहुंचा जा सकता वस्तु की एक विशेषता में Car के संदर्भ में बचा सकता है। Car उदाहरण तब पूरी तरह से पहुंच योग्य हो जाता है और अब कचरा संग्रह के लिए योग्य नहीं है।

  • यदि जीसी वर्णित राज्य में Car के साथ चलता है, तो जेवीएम स्पेक इस बात की गारंटी नहीं देता है कि कमजोर पहुंचने योग्य अगले जीसी चक्र में पता लगाया जाएगा।उदाहरण के लिए, यदि कोई दिया गया जीसी चक्र केवल नवीनतम पीढ़ी एकत्र करता है (और Car को पुरानी पीढ़ी में पदोन्नत किया गया है) जीसी यह निर्धारित नहीं करेगा कि यह कमजोर पहुंच योग्य है।

  • जब भी जीसी वीक रेफरेंस में Car के संदर्भ को तोड़ता है, तो Car इंस्टेंस तुरंत पुनः प्राप्त नहीं किया जाता है। इसके बजाय, बाद में जीसी चक्र में अब पहुंचने योग्य Car का पुनर्मूल्यांकन संभवतः (अंतिम अंतिमकरण के बाद) होगा।