8.1 जावा में कमजोर संदर्भ
जावा में कई प्रकार के संदर्भ हैं।
स्ट्रॉन्ग रेफरेंस है - ये सबसे आम लिंक हैं जो हम हर दिन बनाते हैं।
Object object = new Object();//created an object
object = null;//can now be garbage collected
और तीन "विशेष" प्रकार के लिंक हैं - सॉफ्ट रेफरेंस, वीक रेफरेंस, फैंटम रेफरेंस। वास्तव में, सभी प्रकार के लिंक के बीच केवल एक ही अंतर है - जीसी का व्यवहार उन वस्तुओं के साथ होता है जिन्हें वे संदर्भित करते हैं। हम प्रत्येक लिंक प्रकार की बारीकियों पर बाद में और अधिक विस्तार से चर्चा करेंगे, लेकिन अभी के लिए, निम्नलिखित ज्ञान पर्याप्त होगा:
- सॉफ्ट रेफरेंस एक सॉफ्ट रेफरेंस है, अगर GC देखता है कि कोई ऑब्जेक्ट केवल सॉफ्ट रेफरेंस की एक श्रृंखला के माध्यम से ही एक्सेस किया जा सकता है, तो वह इसे मेमोरी से हटा देगा। शायद।
- कमजोर संदर्भ - एक कमजोर संदर्भ, यदि जीसी देखता है कि कोई वस्तु केवल कमजोर संदर्भों की श्रृंखला के माध्यम से ही पहुंच योग्य है, तो वह इसे स्मृति से हटा देगा।
- PhantomReference एक प्रेत संदर्भ है, यदि GC देखता है कि कोई वस्तु केवल प्रेत संदर्भों की एक श्रृंखला के माध्यम से उपलब्ध है, तो वह इसे स्मृति से हटा देगा। जीसी के कई रन के बाद।
आप यह भी कह सकते हैं कि लिंक प्रकारों में कुछ हद तक कोमलता होती है:
- एक नियमित हार्ड लिंक संदर्भ प्रकार का कोई चर है। उपयोग न होने से पहले कूड़ा बीनने वाले द्वारा साफ नहीं किया जाता है।
- शीतल संदर्भ । ऑब्जेक्ट सभी मेमोरी का उपयोग करने का कारण नहीं बनेगा - आउटऑफमेमरी एरर होने से पहले इसे हटाने की गारंटी है। शायद पहले, कचरा संग्राहक के कार्यान्वयन पर निर्भर करता है।
- कमजोर संदर्भ । कमजोर मुलायम। वस्तु को निपटाने से नहीं रोकता है; कचरा संग्राहक ऐसे संदर्भों की उपेक्षा करता है।
- प्रेत संदर्भ । किसी वस्तु की "मृत्यु" प्रसंस्करण के लिए उपयोग किया जाता है: वस्तु अंतिम रूप देने के बाद तब तक उपलब्ध होती है जब तक कि वह कचरा एकत्र न हो जाए।
यदि यह अभी तक स्पष्ट नहीं है कि अंतर क्या है, तो चिंता न करें, जल्द ही सब ठीक हो जाएगा। विवरण विवरण में हैं, और विवरण का पालन करेंगे।
8.2 जावा में कमजोर संदर्भ और नरम संदर्भ
सबसे पहले, आइए Java में WeakReference और SoftReference के बीच के अंतर को देखें।
संक्षेप में, कचरा संग्राहक किसी वस्तु की मेमोरी को मुक्त कर देगा यदि केवल कमजोर संदर्भ इसे इंगित करते हैं। यदि ऑब्जेक्ट को सॉफ़्ट रेफरेंस द्वारा इंगित किया जाता है, तो जेवीएम को स्मृति की सख्त आवश्यकता होने पर स्मृति को हटा दिया जाता है।
यह कुछ मामलों में मजबूत संदर्भ पर सॉफ्ट रेफरेंस को एक निश्चित लाभ देता है । उदाहरण के लिए, सॉफ्ट रेफरेंस का उपयोग एप्लिकेशन कैश को लागू करने के लिए किया जाता है, इसलिए जेवीएम सबसे पहले उन वस्तुओं को हटा देगा जो केवल सॉफ्ट रेफरेंस इंगित करते हैं।
WeakReference मेटाडेटा को संग्रहीत करने के लिए बहुत अच्छा है, जैसे कि ClassLoader के संदर्भ को संग्रहीत करना। यदि कोई वर्ग लोड नहीं होता है, तो आपको क्लासलोडर का संदर्भ नहीं देना चाहिए। यही कारण है कि WeakReference कचरा संग्रहकर्ता के लिए यह संभव बनाता है कि जैसे ही उसका अंतिम मजबूत संदर्भ हटा दिया जाए, वह ClassLoader पर अपना काम कर सके।
जावा में कमजोर संदर्भ उदाहरण:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
जावा में सॉफ्ट रेफरेंस उदाहरण:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 जावा में फैंटम रेफरेंस
PhantomReference उदाहरण WeakReference और SoftReference उदाहरणों की तरह ही बनाया गया है, लेकिन इसका उपयोग शायद ही कभी किया जाता है।
यदि वस्तु में मजबूत (मजबूत), कमजोर (कमजोर संदर्भ), या नरम (सॉफ्ट संदर्भ) संदर्भ नहीं हैं, तो एक प्रेत संदर्भ कचरा एकत्र किया जा सकता है।
आप इस तरह एक प्रेत संदर्भ वस्तु बना सकते हैं:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference का उपयोग उन स्थितियों में किया जा सकता है जहाँ finalize() समझ में नहीं आता है। यह संदर्भ प्रकार अन्य प्रकारों से भिन्न है क्योंकि इसे किसी वस्तु तक पहुँचने के लिए डिज़ाइन नहीं किया गया है। यह एक संकेत है कि वस्तु को पहले ही अंतिम रूप दे दिया गया है और कचरा संग्राहक इसकी मेमोरी को पुनः प्राप्त करने के लिए तैयार है।
ऐसा करने के लिए, कचरा संग्राहक इसे आगे की प्रक्रिया के लिए एक विशेष संदर्भ कतार में रखता है। रेफरेंसक्यू वह जगह है जहां ऑब्जेक्ट रेफरेंस को फ्री मेमोरी में रखा जाता है।
प्रेत संदर्भ यह जानने का एक सुरक्षित तरीका है कि किसी वस्तु को स्मृति से हटा दिया गया है। उदाहरण के लिए, एक एप्लिकेशन पर विचार करें जो बड़ी छवियों से संबंधित है। मान लीजिए कि हम स्मृति में एक छवि लोड करना चाहते हैं जब यह पहले से ही स्मृति में है, जो कचरा संग्रह के लिए तैयार है। इस मामले में, हम नई छवि को स्मृति में लोड करने से पहले पुरानी छवि को मारने के लिए कचरा कलेक्टर की प्रतीक्षा करना चाहते हैं।
यहाँ PhantomReference एक लचीला और सुरक्षित विकल्प है। पुरानी छवि वस्तु नष्ट होने के बाद पुरानी छवि का संदर्भ संदर्भ कतार में भेज दिया जाएगा। एक बार हमारे पास यह लिंक हो जाने के बाद, हम नई छवि को मेमोरी में लोड कर सकते हैं।