मैंने इस लेख को विषय के बारे में पढ़ा है , लेकिन मैं वास्तव में इसे नहीं समझता। कृपया मुझे उदाहरणों का वर्णन करते समय कुछ सलाह दें।
मैंने इस लेख को विषय के बारे में पढ़ा है , लेकिन मैं वास्तव में इसे नहीं समझता। कृपया मुझे उदाहरणों का वर्णन करते समय कुछ सलाह दें।
जवाबों:
जावा संदर्भ वस्तुओं के दो अलग-अलग प्रकार / वर्ग प्रदान करता है : मजबूत और कमजोर । कमजोर संदर्भ वस्तुओं को आगे नरम और प्रेत में विभाजित किया जा सकता है ।
चलो बिंदु से बात करते हैं।
मजबूत संदर्भ वस्तु
StringBuilder builder = new StringBuilder();
यह संदर्भ ऑब्जेक्ट का डिफ़ॉल्ट प्रकार / वर्ग है, यदि अलग-अलग निर्दिष्ट नहीं किया गया है: builder
एक मजबूत संदर्भ वस्तु है। इस तरह का संदर्भ संदर्भित ऑब्जेक्ट को GC के लिए योग्य नहीं बनाता है। अर्थात्, जब भी किसी वस्तु को मजबूत संदर्भ वस्तुओं की श्रृंखला द्वारा संदर्भित किया जाता है , तो इसे कचरा एकत्र नहीं किया जा सकता है।
कमजोर संदर्भ वस्तु
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);
कमजोर संदर्भ ऑब्जेक्ट्स संदर्भ ऑब्जेक्ट के डिफ़ॉल्ट प्रकार / वर्ग नहीं हैं और उपयोग किए जाने के लिए उन्हें उपरोक्त उदाहरण की तरह स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। इस तरह का संदर्भ संदर्भ वस्तु को जीसी के लिए योग्य बनाता है। यही कारण है कि, यदि StringBuilder
स्मृति में ऑब्जेक्ट के लिए एकमात्र संदर्भ उपलब्ध है, वास्तव में, कमजोर संदर्भ, तो GC को StringBuilder
ऑब्जेक्ट को इकट्ठा करने की अनुमति दी जाती है । जब मेमोरी में कोई ऑब्जेक्ट केवल कमजोर संदर्भ ऑब्जेक्ट द्वारा पहुंच योग्य होता है, तो यह स्वचालित रूप से जीसी के लिए पात्र हो जाता है।
कमजोरी का स्तर
कमजोरी के दो अलग-अलग स्तरों को सूचीबद्ध किया जा सकता है: नरम और प्रेत ।
एक नरम संदर्भ वस्तु मूल रूप से एक कमजोर संदर्भ वस्तु है जो स्मृति में थोड़ी अधिक रहती है: आम तौर पर, यह जीसी चक्र का विरोध करता है जब तक कि कोई स्मृति उपलब्ध नहीं होती है और OutOfMemoryError
उस स्थिति में जोखिम होता है (इसे हटाया जा सकता है)।
दूसरी ओर, एक फैंटम रेफरेंस ऑब्जेक्ट केवल ठीक से जानने के लिए उपयोगी है जब किसी ऑब्जेक्ट को मेमोरी से प्रभावी रूप से हटा दिया गया हो: आम तौर पर वे अजीब अंतिम () पुनरुत्थान / पुनरुत्थान व्यवहार को ठीक करने के लिए उपयोग किए जाते हैं , क्योंकि वे वास्तव में ऑब्जेक्ट को स्वयं वापस नहीं करते हैं लेकिन केवल उनकी स्मृति उपस्थिति पर नज़र रखने में मदद करते हैं ।
कमजोर संदर्भ ऑब्जेक्ट कैश मॉड्यूल को लागू करने के लिए आदर्श होते हैं। वास्तव में, जीसी को स्मृति क्षेत्रों को साफ करने की अनुमति देकर एक प्रकार का स्वचालित निष्कासन लागू किया जा सकता है जब भी वस्तुओं / मूल्यों को मजबूत संदर्भ श्रृंखला द्वारा अब उपलब्ध नहीं किया जाता है। एक उदाहरण कमजोर कुंजियों को बनाए रखने वाला WeakHashMap है ।
कमजोर संदर्भ:
एक कमजोर संदर्भ, सीधे शब्दों में कहें, एक संदर्भ है जो किसी वस्तु को स्मृति में रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है। कमजोर संदर्भ आपको कचरा संग्राहक की क्षमता का लाभ उठाने की अनुमति देते हैं, ताकि आप उसके लिए पुन: सक्रियता निर्धारित कर सकें, इसलिए आपको इसे स्वयं करने की आवश्यकता नहीं है।
नरम संदर्भ:
एक नरम संदर्भ बिल्कुल एक कमजोर संदर्भ की तरह है, सिवाय इसके कि वह जिस वस्तु को संदर्भित करता है उसे फेंकने के लिए कम उत्सुक है। एक वस्तु जो केवल कमजोर रूप से उपलब्ध होती है (इसके लिए सबसे मजबूत संदर्भ WeakReferences हैं) को अगले कचरा संग्रह चक्र में छोड़ दिया जाएगा, लेकिन एक वस्तु जो धीरे-धीरे उपलब्ध है, वह आमतौर पर थोड़ी देर के लिए चिपक जाएगी।
प्रेत संदर्भ:
एक प्रेत संदर्भ या तो सॉफ्टरेंफर या वीकेरफेरेंस की तुलना में काफी अलग है। इसकी वस्तु पर इसकी पकड़ इतनी अधिक है कि आप वस्तु को पुनः प्राप्त भी नहीं कर सकते हैं - इसकी प्राप्त () विधि हमेशा शून्य होती है। इस तरह के एक संदर्भ के लिए केवल उपयोग इस बात का ध्यान रख रहा है कि जब यह एक संदर्भ-पंक्ति में शामिल हो जाता है, तो उस बिंदु पर आप उस वस्तु को जानते हैं जिस पर यह इंगित किया गया है कि वह मर चुका है।
यह पाठ इससे निकाला गया था: https://weblogs.java.net/blog/2006/05/04/understanding-weak-refer
के बीच सरल अंतर SoftReference
और Android डेवलपरWeakReference
द्वारा प्रदान किया गया है ।
एक SoftReference
और एक के बीच का अंतर WeakReference
उस समय का बिंदु है जिस पर निर्णय को स्पष्ट करने और संदर्भ को समझने के लिए किया जाता है:
यदि SoftReference
वीएम को स्मृति से बाहर जाने का खतरा है, तो क्लीयर किया जाना चाहिए और जितनी देर हो सके, उतनी देर से लागू किया जाना चाहिए।
WeakReference
कमजोर संदर्भ के रूप में जल्द से जल्द एक को मंजूरी दे दी और लागू किया जा सकता है।
आपके द्वारा उपयोग किए गए तीन शब्द अधिकतर कचरा एकत्र करने के लिए ऑब्जेक्ट की पात्रता से संबंधित हैं।
कमजोर संदर्भ :: इसका एक संदर्भ जो कि मेमोरी में बने रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है। इसके कचरा कलेक्टर की सनक कचरा संग्रहण के लिए उस वस्तु लेने के लिए। आप इसे इकट्ठा करने के लिए GC को बाध्य नहीं कर सकते ।
सॉफ्ट रेफरेंस :: इसका कमोबेश कमजोर संदर्भ जैसा है। लेकिन आप कह सकते हैं कि यह कचरा संग्रह से कमजोर संदर्भ की तुलना में वस्तु को थोड़ा अधिक मजबूती से रखता है।
यदि कचरा संग्रहकर्ता पहले जीवन चक्र में ही कमजोर संदर्भ एकत्र करता है, तो यह कचरा संग्रह के अगले चक्र में नरम संदर्भ एकत्र करेगा।
सशक्त संदर्भ :: यह उपरोक्त दो प्रकार के संदर्भों के ठीक विपरीत है। वे कम कचरा इकट्ठा करना पसंद करते हैं (ज्यादातर वे कभी एकत्र नहीं होते हैं।)
आप अधिक जानकारी के लिए निम्न लिंक का उल्लेख कर सकते हैं:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html
यह लेख मजबूत, नरम, कमजोर और प्रेत संदर्भों को समझने के लिए सुपर सहायक हो सकता है।
आपको एक सारांश देने के लिए,
यदि आपके पास एक मजबूत संदर्भ है ऑब्जेक्ट का है, तो जीसी (कचरा कलेक्टर) द्वारा ऑब्जेक्ट को कभी भी एकत्र / पुनः प्राप्त नहीं किया जा सकता है।
यदि आपके पास केवल कमजोर संदर्भ हैं किसी ऑब्जेक्ट के (कोई मजबूत संदर्भ नहीं है), तो ऑब्जेक्ट को अगले जीसी चक्र में जीसी द्वारा पुनः प्राप्त किया जाएगा।
यदि आपके पास केवल किसी ऑब्जेक्ट के लिए नरम संदर्भ हैं (कोई मजबूत संदर्भ के साथ), तो ऑब्जेक्ट को जीसी द्वारा तभी पुनः प्राप्त किया जाएगा जब जेवीएम मेमोरी से बाहर निकलता है।
जब किसी वस्तु की गणना हो जाती है तो हम उसका ध्यान रखने के लिए किसी वस्तु का प्रेत संदर्भ बनाते हैं ReferenceQueue
। एक बार जब आप जान जाते हैं कि आप बारीक-बारीक काम कर सकते हैं। (यह आपको गलती से ऑब्जेक्ट को फिर से जीवित करने से बचाएगा क्योंकि प्रेत-संदर्भ आपको रेफ़रेंट नहीं देता है)। मैं आपको इस बारे में गहराई से जानकारी प्राप्त करने के लिए इस लेख को पढ़ने का सुझाव दूंगा।
तो आप कह सकते हैं कि, मजबूत संदर्भों में अंतिम शक्ति होती है (जीसी द्वारा कभी एकत्र नहीं की जा सकती)
नरम संदर्भ कमजोर संदर्भों की तुलना में शक्तिशाली होते हैं (चूंकि वे जीसी चक्र से बच सकते हैं जब तक कि जेवीएम मेमोरी से बाहर नहीं निकलता)
कमजोर संदर्भ नरम संदर्भों की तुलना में भी कम शक्तिशाली होते हैं (क्योंकि वे किसी भी जीसी चक्र से बच नहीं सकते हैं और यदि कोई अन्य मजबूत संदर्भ नहीं है तो उन्हें पुनः प्राप्त किया जाएगा)।
भोजनालय सादृश्य
अब अगर आप एक मजबूत ग्राहक हैं (मजबूत संदर्भ के अनुरूप) हैं, तो भी अगर कोई नया ग्राहक रेस्तरां में आता है या ऐसा कभी खुश हो जाता है, तो आप अपनी मेज (ढेर पर स्मृति क्षेत्र) को कभी नहीं छोड़ेंगे। वेटर को आपको (या यहां तक कि आपसे अनुरोध करता है) रेस्तरां छोड़ने का कोई अधिकार नहीं है।
यदि आप एक नरम ग्राहक (नरम संदर्भ के अनुरूप) हैं, तो यदि कोई नया ग्राहक रेस्तरां में आता है, तो वेटर आपको टेबल छोड़ने के लिए नहीं कहेगा जब तक कि नए ग्राहक को समायोजित करने के लिए कोई अन्य खाली टेबल न हो। (दूसरे शब्दों में वेटर आपको केवल एक नया ग्राहक कदम रखने पर टेबल छोड़ने के लिए कहेगा और इस नए खाते के लिए कोई अन्य तालिका नहीं है)
यदि आप एक कमजोर ग्राहक (कमजोर संदर्भ के अनुरूप) हैं, तो वेटर, उसकी इच्छा पर, (किसी भी समय) आपको रेस्तरां छोड़ने के लिए कह सकता है: P
संदर्भ की 4 डिग्री - Strong, Weak, Soft, Phantom
मजबूत - एक प्रकार का संदर्भ है, जो संदर्भित ऑब्जेक्ट को GC के लिए योग्य नहीं बनाता है। बिल्डर कक्षाएं। जैसे - StringBuilder
कमजोर - एक संदर्भ है जो जीसी के लिए पात्र है।
शीतल - एक प्रकार का संदर्भ है जिसका ऑब्जेक्ट जीसी के लिए योग्य है जब तक कि मेमोरी एविएबल नहीं है। छवि कैश के लिए सर्वश्रेष्ठ। यह उन्हें तब तक रखेगा जब तक कि स्मृति उपलब्ध न हो।
फैंटम - एक प्रकार का संदर्भ है जिसका ऑब्जेक्ट सीधे जीसी के लिए योग्य है। केवल यह जानने के लिए उपयोग किया जाता है कि स्मृति से कोई वस्तु कब निकाली जाए।
का उपयोग करता है:
आपको पहचानने की अनुमति देता है जब कोई ऑब्जेक्ट मेमोरी से बिल्कुल हटा दिया जाता है।
जब
finalize()
विधि अतिभारित हो जाती है, तो जीसी दो वर्गों के जीसी पात्र वस्तुओं के लिए समय पर फैशन में नहीं हो सकता है। तो प्रेत संदर्भ उन्हें पहले जीसी के लिए योग्य बनाता हैfinalize()
, यही कारण है कि जब अधिकांश ढेर कचरा होता है, तब भी आप आउटऑफ़मैरी एयर्स प्राप्त कर सकते हैं ।
कमजोर संदर्भ कैश मॉड्यूल को लागू करने के लिए आदर्श हैं।
ये आपके नियमित ऑब्जेक्ट सन्दर्भ हैं जिन्हें हम प्रतिदिन कोड करते हैं:
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 होने से रोक सकते हैं। हां, आप कर सकते हैं लेकिन आपको शायद ऐसा नहीं करना चाहिए। इस मामले की जांच करने के लिए जीसी चक्र प्रत्येक वस्तु के लिए कम से कम दो बार होगा जब तक कि वह वस्तु केवल एक प्रेत संदर्भ द्वारा उपलब्ध न हो। यही कारण है कि आप ढेर से बाहर भी भाग सकते हैं, जब आपकी मेमोरी में बहुत सारा कचरा होता है। प्रेत संदर्भों से इसे रोका जा सकता है।
आप जावा (मजबूत, नरम, कमजोर, प्रेत) में मेरे लेख प्रकार के संदर्भों पर अधिक पढ़ सकते हैं ।