जावा: मजबूत / नरम / कमजोर / प्रेत संदर्भ के बीच अंतर


179

मैंने इस लेख को विषय के बारे में पढ़ा है , लेकिन मैं वास्तव में इसे नहीं समझता। कृपया मुझे उदाहरणों का वर्णन करते समय कुछ सलाह दें।



4
मैंने उस दस्तावेज़ को पढ़ा है, यह मुझे इस बात की कल्पना करने में मदद नहीं करता है कि क्या अंतर है। (हो सकता है क्योंकि यह एक कठिन-पढ़ा हुआ दस्तावेज़ है)

14
यदि आप उस लेख को पढ़ते हैं और फिर भी समझ नहीं पाते हैं, तो क्या आपके पास इसके बारे में विशिष्ट प्रश्न हैं? यहां "कृपया मुझे फू समझाएं," इसका जवाब देना मुश्किल है, "इसका क्या मतलब है," "मुझे यह नहीं मिला" बिना बारीकियों के बताए कि आपको कौन से हिस्से नहीं मिलते हैं।
यशवित


@LouisWasserman शीर्ष लिंक अब मान्य नहीं है।
मेहराज मलिक

जवाबों:


142

जावा संदर्भ वस्तुओं के दो अलग-अलग प्रकार / वर्ग प्रदान करता है : मजबूत और कमजोर । कमजोर संदर्भ वस्तुओं को आगे नरम और प्रेत में विभाजित किया जा सकता है ।

  • बलवान
  • कमज़ोर
    • मुलायम
    • प्रेत

चलो बिंदु से बात करते हैं।

मजबूत संदर्भ वस्तु

StringBuilder builder = new StringBuilder();

यह संदर्भ ऑब्जेक्ट का डिफ़ॉल्ट प्रकार / वर्ग है, यदि अलग-अलग निर्दिष्ट नहीं किया गया है: builderएक मजबूत संदर्भ वस्तु है। इस तरह का संदर्भ संदर्भित ऑब्जेक्ट को GC के लिए योग्य नहीं बनाता है। अर्थात्, जब भी किसी वस्तु को मजबूत संदर्भ वस्तुओं की श्रृंखला द्वारा संदर्भित किया जाता है , तो इसे कचरा एकत्र नहीं किया जा सकता है।

कमजोर संदर्भ वस्तु

WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);

कमजोर संदर्भ ऑब्जेक्ट्स संदर्भ ऑब्जेक्ट के डिफ़ॉल्ट प्रकार / वर्ग नहीं हैं और उपयोग किए जाने के लिए उन्हें उपरोक्त उदाहरण की तरह स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। इस तरह का संदर्भ संदर्भ वस्तु को जीसी के लिए योग्य बनाता है। यही कारण है कि, यदि StringBuilderस्मृति में ऑब्जेक्ट के लिए एकमात्र संदर्भ उपलब्ध है, वास्तव में, कमजोर संदर्भ, तो GC को StringBuilderऑब्जेक्ट को इकट्ठा करने की अनुमति दी जाती है । जब मेमोरी में कोई ऑब्जेक्ट केवल कमजोर संदर्भ ऑब्जेक्ट द्वारा पहुंच योग्य होता है, तो यह स्वचालित रूप से जीसी के लिए पात्र हो जाता है।

कमजोरी का स्तर

कमजोरी के दो अलग-अलग स्तरों को सूचीबद्ध किया जा सकता है: नरम और प्रेत

एक नरम संदर्भ वस्तु मूल रूप से एक कमजोर संदर्भ वस्तु है जो स्मृति में थोड़ी अधिक रहती है: आम तौर पर, यह जीसी चक्र का विरोध करता है जब तक कि कोई स्मृति उपलब्ध नहीं होती है और OutOfMemoryErrorउस स्थिति में जोखिम होता है (इसे हटाया जा सकता है)।

दूसरी ओर, एक फैंटम रेफरेंस ऑब्जेक्ट केवल ठीक से जानने के लिए उपयोगी है जब किसी ऑब्जेक्ट को मेमोरी से प्रभावी रूप से हटा दिया गया हो: आम तौर पर वे अजीब अंतिम () पुनरुत्थान / पुनरुत्थान व्यवहार को ठीक करने के लिए उपयोग किए जाते हैं , क्योंकि वे वास्तव में ऑब्जेक्ट को स्वयं वापस नहीं करते हैं लेकिन केवल उनकी स्मृति उपस्थिति पर नज़र रखने में मदद करते हैं

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


76

कमजोर संदर्भ:

एक कमजोर संदर्भ, सीधे शब्दों में कहें, एक संदर्भ है जो किसी वस्तु को स्मृति में रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है। कमजोर संदर्भ आपको कचरा संग्राहक की क्षमता का लाभ उठाने की अनुमति देते हैं, ताकि आप उसके लिए पुन: सक्रियता निर्धारित कर सकें, इसलिए आपको इसे स्वयं करने की आवश्यकता नहीं है।

नरम संदर्भ:

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

प्रेत संदर्भ:

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

यह पाठ इससे निकाला गया था: https://weblogs.java.net/blog/2006/05/04/understanding-weak-refer


1
जबकि इस उत्तर में सब कुछ सही दिखता है, यह मुझे भी दिखता है जैसे लिंक किए गए वेबपेज पर कोई त्रुटि हो सकती है। पैकेज java.lang.ref के लिए जावाडोक और उस PhantomReference का सुझाव के लिए है कि एक वस्तु जब तक के बाद यह अब "प्रेत से पहुंचा जा सकता है", जिसका अर्थ है कि (SoftReference के विपरीत) एक PhantomReference वस्तु यह कर सकते हैं को संदर्भित करता है से पहले dequeued किया जाना चाहिए कचरा एकत्र नहीं है कचरा इकट्ठा किया जाए ... और इसके होने का संकेत यह नहीं देता है कि संबंधित मेमोरी को मुक्त कर दिया गया है।
थियोडोर मर्डॉक

2
रिकॉर्ड के लिए, मैं बहुत कुछ ऐसी दुनिया में रहना चाहता हूँ जहाँ ब्लॉग पोस्ट सही है।
थियोडोर मर्डॉक

1
@ TheodoreMurdock javadoc सही है। एक प्रेत संदर्भ कचरा संग्रह को बाधित नहीं करता है। एक बार जब कोई ऑब्जेक्ट एनकाउंटर कर दिया जाता है, तो उसे किसी फ़ाइनलीज़र द्वारा भी नहीं बचाया जा सकता है, क्योंकि फ़ाइनलीज़र पहले ही दौड़ चुका है। यह मर चुका है, लेकिन अभी तक नहीं गया है।
Leliel

@ लिलील वास्तव में, एक प्रेत संदर्भ वास्तव में कचरा संग्रह को बाधित करने के बाद बाधित करता है ... मुझे यह हाल ही में एहसास हुआ जब एक बग ने सफाई धागे को जल्दी से बाहर निकलने का कारण बना। प्रेत संदर्भों का अस्तित्व यह सुनिश्चित करने के लिए पर्याप्त था कि मेरे ढेर डंप में हर प्रेत संदर्भित वस्तु को बरकरार रखा गया था, संग्रह के लिए अनुपलब्ध ... यदि आप कतार को संसाधित करने में विफल रहते हैं, या कतार को संसाधित करते समय प्रेत संदर्भ को gc के लिए योग्य बनाने में विफल रहते हैं ( और स्पष्ट नहीं है () प्रेत संदर्भ), फिर आपकी मेमोरी लीक में प्रेत संदर्भ और संदर्भित ऑब्जेक्ट दोनों शामिल होंगे।
थियोडोर मर्डॉक

25

के बीच सरल अंतर SoftReferenceऔर Android डेवलपरWeakReference द्वारा प्रदान किया गया है

एक SoftReferenceऔर एक के बीच का अंतर WeakReferenceउस समय का बिंदु है जिस पर निर्णय को स्पष्ट करने और संदर्भ को समझने के लिए किया जाता है:

  • यदि SoftReferenceवीएम को स्मृति से बाहर जाने का खतरा है, तो क्लीयर किया जाना चाहिए और जितनी देर हो सके, उतनी देर से लागू किया जाना चाहिए।

  • WeakReferenceकमजोर संदर्भ के रूप में जल्द से जल्द एक को मंजूरी दे दी और लागू किया जा सकता है।


16

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

कमजोर संदर्भ :: इसका एक संदर्भ जो कि मेमोरी में बने रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है। इसके कचरा कलेक्टर की सनक कचरा संग्रहण के लिए उस वस्तु लेने के लिए। आप इसे इकट्ठा करने के लिए GC को बाध्य नहीं कर सकते

सॉफ्ट रेफरेंस :: इसका कमोबेश कमजोर संदर्भ जैसा है। लेकिन आप कह सकते हैं कि यह कचरा संग्रह से कमजोर संदर्भ की तुलना में वस्तु को थोड़ा अधिक मजबूती से रखता है।

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

सशक्त संदर्भ :: यह उपरोक्त दो प्रकार के संदर्भों के ठीक विपरीत है। वे कम कचरा इकट्ठा करना पसंद करते हैं (ज्यादातर वे कभी एकत्र नहीं होते हैं।)

आप अधिक जानकारी के लिए निम्न लिंक का उल्लेख कर सकते हैं:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html


3
मुझे लगता है कि यह गलत है - "अगर कचरा उठाने वाले पहले जीवन चक्र में कमजोर संदर्भ एकत्र करते हैं, तो यह कचरा संग्रह के अगले चक्र में नरम संदर्भ एकत्र करेगा।" यह जरूरी नहीं है कि आप जीसी के लगातार चलने में कैसे सुनिश्चित हो सकते हैं? जीसी 2 रे रन और 3 रन में भी सॉफ्ट रेफरेंस ऑब्जेक्ट को रहने की अनुमति दे सकता है। इसके लिए कोई दस्तावेज नहीं है, अगर वहाँ है तो कृपया लिंक को निर्दिष्ट करने का उल्लेख करें।
सौरभ पाटिल

2
इसके अलावा, आपका जवाब थोड़ा अस्पष्ट है, इस वाक्य को देखें 'कमजोर संदर्भ के समान ही कमोबेश यही है। लेकिन आप कह सकते हैं कि यह कचरा संग्रह से कमजोर संदर्भ की तुलना में वस्तु को थोड़ा अधिक मजबूती से रखता है। ' - वह स्पष्ट रूप से अंतर और समानता नहीं के बारे में पूछ रहा है, ये सभी शब्द स्पष्टता से अधिक भ्रम को विषय में जोड़ते हैं।
सौरभ पाटिल

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

14

यह लेख मजबूत, नरम, कमजोर और प्रेत संदर्भों को समझने के लिए सुपर सहायक हो सकता है।


आपको एक सारांश देने के लिए,

यदि आपके पास एक मजबूत संदर्भ है ऑब्जेक्ट का है, तो जीसी (कचरा कलेक्टर) द्वारा ऑब्जेक्ट को कभी भी एकत्र / पुनः प्राप्त नहीं किया जा सकता है।

यदि आपके पास केवल कमजोर संदर्भ हैं किसी ऑब्जेक्ट के (कोई मजबूत संदर्भ नहीं है), तो ऑब्जेक्ट को अगले जीसी चक्र में जीसी द्वारा पुनः प्राप्त किया जाएगा।

यदि आपके पास केवल किसी ऑब्जेक्ट के लिए नरम संदर्भ हैं (कोई मजबूत संदर्भ के साथ), तो ऑब्जेक्ट को जीसी द्वारा तभी पुनः प्राप्त किया जाएगा जब जेवीएम मेमोरी से बाहर निकलता है।

जब किसी वस्तु की गणना हो जाती है तो हम उसका ध्यान रखने के लिए किसी वस्तु का प्रेत संदर्भ बनाते हैं ReferenceQueue। एक बार जब आप जान जाते हैं कि आप बारीक-बारीक काम कर सकते हैं। (यह आपको गलती से ऑब्जेक्ट को फिर से जीवित करने से बचाएगा क्योंकि प्रेत-संदर्भ आपको रेफ़रेंट नहीं देता है)। मैं आपको इस बारे में गहराई से जानकारी प्राप्त करने के लिए इस लेख को पढ़ने का सुझाव दूंगा।


तो आप कह सकते हैं कि, मजबूत संदर्भों में अंतिम शक्ति होती है (जीसी द्वारा कभी एकत्र नहीं की जा सकती)

नरम संदर्भ कमजोर संदर्भों की तुलना में शक्तिशाली होते हैं (चूंकि वे जीसी चक्र से बच सकते हैं जब तक कि जेवीएम मेमोरी से बाहर नहीं निकलता)

कमजोर संदर्भ नरम संदर्भों की तुलना में भी कम शक्तिशाली होते हैं (क्योंकि वे किसी भी जीसी चक्र से बच नहीं सकते हैं और यदि कोई अन्य मजबूत संदर्भ नहीं है तो उन्हें पुनः प्राप्त किया जाएगा)।


भोजनालय सादृश्य

  • वेटर - जीसी
  • आप - ढेर में वस्तु
  • रेस्टॉरेंट एरिया / स्पेस - हीप स्पेस
  • नया ग्राहक - नई वस्तु जो रेस्तरां में टेबल चाहती है

अब अगर आप एक मजबूत ग्राहक हैं (मजबूत संदर्भ के अनुरूप) हैं, तो भी अगर कोई नया ग्राहक रेस्तरां में आता है या ऐसा कभी खुश हो जाता है, तो आप अपनी मेज (ढेर पर स्मृति क्षेत्र) को कभी नहीं छोड़ेंगे। वेटर को आपको (या यहां तक ​​कि आपसे अनुरोध करता है) रेस्तरां छोड़ने का कोई अधिकार नहीं है।

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

यदि आप एक कमजोर ग्राहक (कमजोर संदर्भ के अनुरूप) हैं, तो वेटर, उसकी इच्छा पर, (किसी भी समय) आपको रेस्तरां छोड़ने के लिए कह सकता है: P


10

संदर्भ की 4 डिग्री - Strong, Weak, Soft, Phantom

मजबूत - एक प्रकार का संदर्भ है, जो संदर्भित ऑब्जेक्ट को GC के लिए योग्य नहीं बनाता है। बिल्डर कक्षाएं। जैसे - StringBuilder

कमजोर - एक संदर्भ है जो जीसी के लिए पात्र है।

शीतल - एक प्रकार का संदर्भ है जिसका ऑब्जेक्ट जीसी के लिए योग्य है जब तक कि मेमोरी एविएबल नहीं है। छवि कैश के लिए सर्वश्रेष्ठ। यह उन्हें तब तक रखेगा जब तक कि स्मृति उपलब्ध न हो।

फैंटम - एक प्रकार का संदर्भ है जिसका ऑब्जेक्ट सीधे जीसी के लिए योग्य है। केवल यह जानने के लिए उपयोग किया जाता है कि स्मृति से कोई वस्तु कब निकाली जाए।

का उपयोग करता है:

  1. आपको पहचानने की अनुमति देता है जब कोई ऑब्जेक्ट मेमोरी से बिल्कुल हटा दिया जाता है।

  2. जब finalize()विधि अतिभारित हो जाती है, तो जीसी दो वर्गों के जीसी पात्र वस्तुओं के लिए समय पर फैशन में नहीं हो सकता है। तो प्रेत संदर्भ उन्हें पहले जीसी के लिए योग्य बनाता है finalize(), यही कारण है कि जब अधिकांश ढेर कचरा होता है, तब भी आप आउटऑफ़मैरी एयर्स प्राप्त कर सकते हैं ।

कमजोर संदर्भ कैश मॉड्यूल को लागू करने के लिए आदर्श हैं।


10

मजबूत संदर्भ

ये आपके नियमित ऑब्जेक्ट सन्दर्भ हैं जिन्हें हम प्रतिदिन कोड करते हैं:

Employee emp = new Employee();

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

जहां तक ​​यह अच्छा है, लेकिन अब हमें अलग-अलग डेटा की आवश्यकता है और हमें उन कर्मचारी वस्तुओं की आवश्यकता नहीं है और ये कैश के अलावा कहीं से संदर्भित नहीं हैं। जो मेमोरी लीक का कारण बन रहा है क्योंकि ये ऑब्जेक्ट उपयोग में नहीं हैं लेकिन फिर भी कचरा संग्रहण के लिए योग्य नहीं हैं और हम उन वस्तुओं को कैश से नहीं निकाल सकते क्योंकि हमारे पास उनका संदर्भ नहीं है? इसलिए यहां या तो हमें पूरे कैश को मैन्युअल रूप से खाली करना होगा जो थकाऊ है या हम अन्य प्रकार के संदर्भों का उपयोग कर सकते हैं जैसे कि कमजोर संदर्भ।

कमजोर संदर्भ

एक कमजोर संदर्भ किसी ऑब्जेक्ट को मेमोरी में पिन नहीं करता है और अन्य संदर्भों से संदर्भित नहीं होने पर अगले GC चक्र में GC'd होगा। हम WeakReference वर्ग का उपयोग कर सकते हैं जो कि जावा द्वारा प्रदान किया गया है जो विभिन्न प्रकार के कैश बनाने के लिए है, जो उन वस्तुओं को संग्रहीत नहीं करेगा जो कहीं और से संदर्भित नहीं हैं।

WeakReference<Cache> cache = new WeakReference<Cache>(data);

डेटा एक्सेस करने के लिए आपको cache.get () पर कॉल करना होगा। यदि कमजोर संदर्भ कचरा एकत्र किया गया था, तो यह कॉल वापस लौट सकती है: एनपीई से बचने के लिए आपको लौटाए गए मूल्य की जांच करनी चाहिए। जावा कमज़ोर संदर्भों का उपयोग करने वाले संग्रह प्रदान करता है, जैसे कमजोर संदर्भों के रूप में WeakHashMap वर्ग कुंजियाँ (मान नहीं) संग्रहीत करता है। यदि कुंजी GC'd है, तो मान स्वचालित रूप से मानचित्र से भी हटा दिया जाएगा।

चूंकि कमजोर संदर्भ वस्तुएं हैं इसलिए हमें उन्हें साफ करने का एक तरीका चाहिए (वे अब उपयोगी नहीं हैं जब वे जिस वस्तु को संदर्भित कर रहे हैं वह GC'd है)। यदि आप एक कमजोर संदर्भ के लिए कंस्ट्रक्टर में एक रेफरेंसक्यूवे पास करते हैं, तो कचरा कलेक्टर अंतिम रूप से या GC'd से पहले रेफरेंसक्यू के उस कमजोर संदर्भ को जोड़ देगा। आप समय-समय पर इस कतार को संसाधित कर सकते हैं और मृत संदर्भों से निपट सकते हैं।

शीतल संदर्भ

एक SoftReference एक WeakReference की तरह होता है लेकिन इसमें कचरा एकत्र होने की संभावना कम होती है। स्मृति की मांग के जवाब में कचरा कलेक्टर के विवेक पर नरम संदर्भों को मंजूरी दे दी गई है। वर्चुअल मशीन गारंटी देती है कि नरम आउटचेबल ऑब्जेक्ट्स के सभी सॉफ्ट रेफरेंस को क्लियर कर दिया जाएगा, इससे पहले कि वह कभी आउटऑफमेरीऑयॉर को फेंक देगा।

प्रेत संदर्भ

प्रेत संदर्भ सभी संदर्भ प्रकारों में सबसे कमजोर हैं, उन पर कॉल करना हमेशा शून्य हो जाएगा। किसी ऑब्जेक्ट को अंतिम रूप दिए जाने के बाद उसे संदर्भित किया जाता है, लेकिन इससे पहले कि इसकी आवंटित मेमोरी को पुनः प्राप्त किया गया हो, जैसा कि कमजोर संदर्भों के विपरीत होता है, जिसे अंतिम रूप देने से पहले उन्हें जोड़ दिया जाता है या GC'd Phantom संदर्भों का उपयोग शायद ही कभी किया जाता है।

तो वे कैसे उपयोगी हैं? जब आप एक प्रेत संदर्भ का निर्माण करते हैं तो आपको हमेशा एक संदर्भ पंक्ति में पास होना चाहिए। यह इंगित करता है कि आप एक प्रेत संदर्भ का उपयोग करके देख सकते हैं कि आपकी वस्तु GC'd कब है।

अरे, इसलिए यदि कमजोर संदर्भों को अंतिम रूप देने पर विचार किया जाता है, लेकिन अभी तक GC'd नहीं है तो हम अंतिम ब्लॉक में ऑब्जेक्ट के लिए एक नया मजबूत संदर्भ बना सकते हैं और ऑब्जेक्ट को GC'd होने से रोक सकते हैं। हां, आप कर सकते हैं लेकिन आपको शायद ऐसा नहीं करना चाहिए। इस मामले की जांच करने के लिए जीसी चक्र प्रत्येक वस्तु के लिए कम से कम दो बार होगा जब तक कि वह वस्तु केवल एक प्रेत संदर्भ द्वारा उपलब्ध न हो। यही कारण है कि आप ढेर से बाहर भी भाग सकते हैं, जब आपकी मेमोरी में बहुत सारा कचरा होता है। प्रेत संदर्भों से इसे रोका जा सकता है।

आप जावा (मजबूत, नरम, कमजोर, प्रेत) में मेरे लेख प्रकार के संदर्भों पर अधिक पढ़ सकते हैं ।


आपने लिखा है कि कमजोर रिफरेन्स को अगले चक्र में GC'ed किया जाएगा यदि अन्य रिफ्रेन्स से रिफ्रेश नहीं किया गया ... लेकिन रिफ्रेंस को स्ट्रेन करने के लिए एक ही चीज नहीं होनी चाहिए? अगर किसी भी तरह से स्ट्रॉन रिफ्रेंस एक्सेस नहीं किया जाता है, तो क्लियर हो जाता है ... तो अगर ऐसा है तो फिर से अंतर कहां है ...? #confused
filemonczyk

1
यदि किसी ऑब्जेक्ट को s1 (मजबूत) और s2 (मजबूत) कहे जाने से संदर्भित किया जा रहा है, तो ऑब्जेक्ट कचरा संग्रहण के लिए योग्य नहीं होगा, जब तक कि s1 और s2 दोनों को छूट नहीं दी जाती है, लेकिन यदि वस्तु s1 (कमजोर) और s2 से संदर्भित हो रही है ( मजबूत) तब वस्तु अगले जीसी चक्र में कचरा संग्रहण के लिए पात्र होगी, जब वह s2 से केवल छूट जाती है, क्योंकि s1 एक कमजोर संदर्भ है और यदि वस्तु में कमजोर के अलावा कोई अन्य संदर्भ नहीं है, तो वह GC के लिए पात्र है
नरेश जोशी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.