117

के बीच अंतर मैंने विषय के बारे में this article पढ़ा है, लेकिन मुझे वास्तव में यह समझ में नहीं आता है। अवधारणाओं का वर्णन करते समय कृपया उदाहरण के साथ मुझे कुछ सलाह दें।जावा: मजबूत/मुलायम/कमजोर/प्रेत संदर्भ

+1

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references –

+3

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

+14

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

उत्तर

14

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

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

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

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

मजबूत संदर्भ :: यह उपर्युक्त दो प्रकार के संदर्भों के विपरीत है। वे कम कचरा एकत्र प्राप्त करना चाहते रहे हैं

आप अधिक जानकारी के लिए नीचे दिए गए लिंक का उल्लेख कर सकते (अधिकतर वे कभी नहीं एकत्र कर रहे हैं।):

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

+1

मुझे लगता है कि यह गलत है - "यदि कचरा संग्रहकर्ता पहले जीवन चक्र में कमजोर संदर्भ एकत्र करते हैं, तो यह कचरा संग्रह के अगले चक्र में नरम संदर्भ एकत्र करेगा।" यह जरूरी नहीं है कि आप कैसे सुनिश्चित हो सकते हैं कि वे लगातार जीसी के चलते होते हैं? जीसी नरम संदर्भित वस्तुओं को दूसरे रन और तीसरे रन में भी रहने की अनुमति दे सकता है। इसके लिए प्रलेखन नहीं है, यदि वहां है तो कृपया निर्दिष्ट लिंक का जिक्र करें। –

+1

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

+0

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

18

SoftReference और WeakReference के बीच सरल अंतर प्रदान की जाती है Android Developer द्वारा। ,

  • एक SoftReference को मंजूरी दे दी जानी चाहिए और संभव के रूप में देर से कतारबद्ध:

    एक SoftReference और एक WeakReference के बीच अंतर समय, जिस पर निर्णय स्पष्ट और संदर्भ enqueue लिए किया जाता है की बात है , यदि वीएम स्मृति से बाहर होने का खतरा है।

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

62

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

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

शीतल संदर्भ:

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

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

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

यह पाठ निकाला गया था से: मजबूत और कमजोर: https://weblogs.java.net/blog/2006/05/04/understanding-weak-references

+2

यह वास्तव में बहुत अच्छा वेबपेज है। – Trismegistos

+1

जबकि इस उत्तर में सबकुछ सही दिखता है, यह मुझे भी देखता है जैसे लिंक किए गए वेबपृष्ठ पर कोई त्रुटि हो सकती है। [Javadoc पैकेज java.lang.ref] के लिए [http://docs.oracle.com/javase/8/docs/api/java/lang/ref/package-summary.html#reachability) और फ़ैंटॉम रिफरेंस के लिए सुझाव है कि एक ऑब्जेक्ट कचरा नहीं होता है जब तक कि यह अब "प्रेत पहुंचने योग्य" नहीं होता है, जिसका मतलब है कि (सॉफ़्ट रेफरेंस के विपरीत) एक फैंटॉम रिफरेंस को उस ऑब्जेक्ट से पहले हटा दिया जाना चाहिए जिसे कचरा इकट्ठा किया जा सकता है ... और इसके द्वारा लगाया जा रहा है यह इंगित नहीं करता है कि संबंधित स्मृति को मुक्त कर दिया गया है। –

+2

रिकॉर्ड के लिए, मैं एक ऐसी दुनिया में रहूंगा जहां वह ब्लॉग पोस्ट सही है। –

96

जावा दो अलग अलग प्रकार/की कक्षाओं संदर्भ ऑब्जेक्ट्स प्रदान करता है। कमजोर संदर्भ वस्तुओं को आगे नरम और प्रेत में विभाजित किया जा सकता है। चलो बिंदु से बिंदु जाओ।

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

StringBuilder builder = new StringBuilder(); 

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

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

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

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

कमजोरी कमजोरी का

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

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

दूसरी ओर, एक प्रेत संदर्भ वस्तु केवल यह जानना चाहेंगे कि जब एक वस्तु को प्रभावी ढंग से स्मृति से हटा दिया गया उपयोगी है: सामान्य रूप से वे अजीब को अंतिम रूप देने() पुनरुद्धार/जी उठने व्यवहार ठीक करने के लिए, के बाद से इस्तेमाल कर रहे हैं वे वास्तव में वस्तु को वापस न करें बल्कि केवल in keeping track of their memory presence की सहायता करें।

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

7

4 डिग्री - Strong, Weak, Soft, Phantom

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

कमजोर - एक संदर्भ है जो जीसी के लिए योग्य है।

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

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

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

  1. जब एक वस्तु वास्तव में स्मृति से निकाल दिया जाता आप की पहचान करने देता है।

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

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

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