अशक्त संदर्भ
कंप्यूटर प्रोग्रामिंग में, एक कमजोर संदर्भ एक संदर्भ (कंप्यूटर विज्ञान) है जो संदर्भित वस्तु (कंप्यूटर विज्ञान) को कचरा संग्रह (कंप्यूटर विज्ञान) द्वारा संग्रह से सुरक्षित नहीं करता है, एक मजबूत संदर्भ के विपरीत। कमजोर संदर्भों द्वारा केवल संदर्भित एक वस्तु - जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में कम से कम एक कमजोर संदर्भ शामिल है - इसे कमजोर पहुंच योग्य माना जाता है और इसे अगम्य स्मृति के रूप में माना जा सकता है और इसलिए हो सकता है किसी भी समय एकत्र किया जा सकता है। कुछ कचरा-संग्रहित भाषाएं कमजोर संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे सी शार्प (प्रोग्रामिंग भाषा)|सी#, जावा (प्रोग्रामिंग भाषा), लिस्प (प्रोग्रामिंग भाषा), OCaml , पर्ल, पायथन (प्रोग्रामिंग भाषा)[1] और PHP संस्करण 7.4 के बाद से।[2]
उपयोग करता है
कमजोर संदर्भों के कई सामान्य उपयोग हैं। संदर्भ गिनती कचरा संग्रह का उपयोग करते समय, कमजोर संदर्भ चक्र में एक लिंक के लिए कमजोर संदर्भ का उपयोग करके संदर्भ चक्र को तोड़ सकते हैं। जब किसी के पास एक साहचर्य सरणी (मैपिंग, हैश मैप) होती है, जिसकी कुंजियाँ (संदर्भ) वस्तुएं होती हैं, उदाहरण के लिए वस्तुओं के बारे में सहायक डेटा रखने के लिए, कुंजियों के लिए कमजोर संदर्भों का उपयोग करने से वस्तुओं को केवल कुंजी के रूप में उपयोग करने के कारण जीवित रखने से बचा जाता है। जब किसी के पास एक वस्तु होती है जहां अन्य वस्तुएं पंजीकृत होती हैं, जैसे कि पर्यवेक्षक पैटर्न (विशेष रूप से घटना से निपटना में), यदि एक मजबूत संदर्भ रखा जाता है, तो वस्तुओं को स्पष्ट रूप से अपंजीकृत होना चाहिए, अन्यथा एक स्मृति रिसाव होता है (व्यपगत श्रोता समस्या), जबकि एक कमजोर संदर्भ अपंजीकृत करने की आवश्यकता को हटा देता है। कैश्ड डेटा को धारण करते समय, जिसे यदि आवश्यक हो तो फिर से बनाया जा सकता है, कमजोर संदर्भ कैश को पुनः प्राप्त करने की अनुमति देते हैं, प्रभावी रूप से त्यागने योग्य मेमोरी का उत्पादन करते हैं। यह अंतिम मामला (एक कैश) दूसरों से अलग है, क्योंकि यह बेहतर है कि यदि आवश्यक हो तो वस्तुओं को केवल कचरा एकत्र किया जाए, और इस प्रकार कमजोर संदर्भों के भीतर बेहतर भेद की आवश्यकता है, यहां एक कमजोर संदर्भ का एक मजबूत रूप है। कई मामलों में कमजोर संदर्भों को सीधे उपयोग करने की आवश्यकता नहीं होती है, इसके बजाय केवल एक कमजोर सरणी या अन्य कंटेनर (अमूर्त डेटा प्रकार) का उपयोग किया जाता है, जिसकी कुंजी या मान कमजोर संदर्भ होते हैं।
कचरा संग्रह
कचरा संग्रह का उपयोग अप्रयुक्त वस्तुओं को साफ करने के लिए किया जाता है और इस प्रकार मेमोरी लीक और डेटा भ्रष्टाचार की संभावना को कम करता है। कचरा संग्रह के दो मुख्य प्रकार हैं: ट्रेसिंग और रेफरेंस काउंटिंग। रेफरेंस काउंटिंग स्कीम किसी दिए गए ऑब्जेक्ट के संदर्भों की संख्या को रिकॉर्ड करती है और रेफरेंस काउंट शून्य होने पर ऑब्जेक्ट को कलेक्ट करती है। संदर्भ-गिनती चक्रीय (या परिपत्र) संदर्भों को एकत्र नहीं कर सकती क्योंकि एक समय में केवल एक ही वस्तु एकत्र की जा सकती है। पारस्परिक रूप से संदर्भित वस्तुओं के समूह जो सीधे अन्य वस्तुओं द्वारा संदर्भित नहीं हैं और अगम्य हैं इस प्रकार स्थायी रूप से निवासी बन सकते हैं; यदि कोई एप्लिकेशन लगातार ऐसे अगम्य समूहों को अगम्य वस्तुओं के रूप में उत्पन्न करता है, तो इसका प्रभाव स्मृति रिसाव पर पड़ेगा। यदि समूह के भीतर कुछ संदर्भों के लिए कमजोर संदर्भों का उपयोग करके संदर्भ चक्रों से बचा जाता है, तो कमजोर संदर्भ (संदर्भ जिन्हें संदर्भ गिनती में नहीं गिना जाता है) का उपयोग परिपत्र संदर्भों की समस्या को हल करने के लिए किया जा सकता है।
इस तरह के मजबूत बनाम कमजोर संदर्भ भेद का एक बहुत ही सामान्य मामला वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ मजबूत हैं, लेकिन बच्चे से माता-पिता के संदर्भ कमजोर हैं। उदाहरण के लिए, ऐप्पल का कोको (एपीआई) ढांचा इस दृष्टिकोण की सिफारिश करता है।[3] वास्तव में, यहां तक कि जब ऑब्जेक्ट ग्राफ एक पेड़ नहीं है, तो एक पेड़ की संरचना अक्सर वस्तु स्वामित्व की धारणा से लागू की जा सकती है, जहां स्वामित्व संबंध मजबूत होते हैं और पेड़ बनाते हैं, और गैर-स्वामित्व संबंध कमजोर होते हैं और पेड़ बनाने की आवश्यकता नहीं होती है। - यह दृष्टिकोण सी ++ (प्री-सी ++ 11) में आम है, कच्चे पॉइंटर्स को कमजोर संदर्भों के रूप में उपयोग करते हुए। हालाँकि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह पता लगाने की क्षमता की अनुमति नहीं है कि कब एक मूल शाखा को हटा दिया गया और हटा दिया गया। C++ 11 मानक के बाद से, Boost (C++ लाइब्रेरी) लाइब्रेरी से विरासत में प्राप्त Smart_pointer#shared_ptr_and_weak_ptr|shared_ptr और Weak_ptr का उपयोग करके एक समाधान जोड़ा गया था।
स्मृति में अनावश्यक वस्तुओं की संख्या को कम करने के लिए कमजोर संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह इंगित करने की अनुमति मिलती है कि कौन सी वस्तुओं को केवल कमजोर रूप से संदर्भित करके मामूली महत्व है।[citation needed]
विविधताएं
कुछ भाषाओं में कमजोर संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा (प्रोग्रामिंग लैंग्वेज) में घटती ताकत, कोमल संदर्भ , कमजोर और प्रेत संदर्भ रेफरेंस के क्रम में जावा पैकेज जावा प्लेटफॉर्म, Standard Edition#java.lang.ref|java.lang.ref में परिभाषित किया गया है।[4] प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। कचरा संग्राहक (जीसी) वस्तु को मुक्त करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को मुक्त करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, लेकिन जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में बहुत अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी कमजोर रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, प्रेत संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, प्रेत संदर्भ कार्यक्रम को सूचित करने के लिए एक तंत्र प्रदान करते हैं जब किसी वस्तु को मुक्त किया गया हो (संदर्भ कतारों का उपयोग करके अधिसूचना लागू की जाती है)। सी # में, कमजोर संदर्भ इस बात से अलग हैं कि वे वस्तु पुनरुत्थान को ट्रैक करते हैं या नहीं। यह भेद मजबूत संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को अंतिम रूप नहीं दिया जाता है यदि उनके पास कोई मजबूत संदर्भ है। डिफ़ॉल्ट रूप से, सी # कमजोर संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो एक कमजोर संदर्भ अद्यतन नहीं होता है; इन्हें छोटा कमजोर संदर्भ कहा जाता है, और कमजोर संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे कमजोर संदर्भ कहा जाता है।[5]
कुछ गैर-कचरा-संग्रहित भाषाएँ, जैसे कि C++, कचरा संग्रह पुस्तकालयों के समर्थन के हिस्से के रूप में कमजोर/मजबूत संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी मजबूत और कमजोर संदर्भ प्रदान करती है। स्मार्ट सूचक ्स के कमजोर समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना एक गलती है क्योंकि इस तरह के उपयोग से यह पता लगाने की क्षमता को हटा दिया जाता है कि मजबूत संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे भी बदतर, यह पता लगाने की अनुमति नहीं देता है कि क्या एक और मजबूत संदर्भ पहले से ही दिए गए सादे सूचक को ट्रैक कर रहा है। यह एक ही प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से एक की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) भ्रष्टाचार का कारण बनता है।
उदाहरण
आवेदन में संदर्भित मौजूदा चर की सूची रखते समय कमजोर संदर्भ उपयोगी हो सकते हैं। इस सूची में वस्तुओं के कमजोर लिंक होने चाहिए। अन्यथा, एक बार वस्तुओं को सूची में जोड़ दिए जाने के बाद, वे इसके द्वारा संदर्भित होंगे और कार्यक्रम की अवधि के लिए बने रहेंगे।
जावा
1998 में जावा 1.2 पेश किया गया[6] दो प्रकार के कमजोर संदर्भ, एक को सॉफ्ट रेफरेंस के रूप में जाना जाता है (जीसी-प्रबंधित इन-मेमोरी कैश को बनाए रखने के लिए उपयोग करने का इरादा है, लेकिन जो एंड्रॉइड जैसे डायनेमिक हीप के साथ कुछ प्लेटफॉर्म पर व्यवहार में बहुत अच्छा काम नहीं करता है[7]) और दूसरा केवल एक कमजोर संदर्भ के रूप में। इसने खतरनाक और अक्षम finalize() तंत्र के विकल्प के रूप में फैंटम संदर्भों को डब किए गए एक संबंधित प्रायोगिक तंत्र को भी जोड़ा।[8]
यदि एक कमजोर संदर्भ बनाया गया है, और फिर कोड में कहीं और get()
वास्तविक वस्तु प्राप्त करने के लिए उपयोग किया जाता है, कमजोर संदर्भ कचरा संग्रहण को रोकने के लिए पर्याप्त मजबूत नहीं है, इसलिए यह हो सकता है (यदि वस्तु के लिए कोई मजबूत संदर्भ नहीं है) get()
अचानक अशक्त होने लगता है।[9]
import java.lang.ref.WeakReference;
public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakReference r = new WeakReference("I'm here");
StrongReference sr = new StrongReference("I'm here");
System.out.println("Before gc: r=" + r.get() + ", static=" + sr.get());
System.gc();
Thread.sleep(100);
// Only r.get() becomes null.
System.out.println("After gc: r=" + r.get() + ", static=" + sr.get());
}
}
कमजोर संदर्भों का एक अन्य उपयोग कैश (कंप्यूटिंग) लिखने में है। उदाहरण के लिए, एक कमजोर हैश मानचित्र का उपयोग करके, एक कमजोर संदर्भ के माध्यम से विभिन्न संदर्भित वस्तुओं को कैश में संग्रहीत किया जा सकता है। जब कचरा संग्राहक चलता है - उदाहरण के लिए जब एप्लिकेशन की मेमोरी का उपयोग पर्याप्त रूप से अधिक हो जाता है - वे कैश्ड ऑब्जेक्ट जो अब अन्य ऑब्जेक्ट्स द्वारा सीधे संदर्भित नहीं होते हैं, कैश से हटा दिए जाते हैं।
स्मालटॉक
|a s1 s2|
s1 := 'hello' copy. "that's a strong reference"
s2 := 'world' copy. "that's a strong reference"
a := WeakArray with:s1 with:s2.
a printOn: Transcript.
ObjectMemory collectGarbage.
a printOn: Transcript. "both elements still there"
s1 := nil. "strong reference goes away"
ObjectMemory collectGarbage.
a printOn: Transcript. "first element gone"
s2 := nil. "strong reference goes away"
ObjectMemory collectGarbage.
a printOn: Transcript. "second element gone"
दो
weak_table = setmetatable({}, {__mode="v"})
weak_table.item = {}
print(weak_table.item)
collectgarbage()
print(weak_table.item)
उद्देश्य-सी 2.0
उद्देश्य सी 2.0 में, न केवल कचरा संग्रह, बल्कि संदर्भ गणना भी कमजोर संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण कमजोर हैं।
@interface WeakRef : NSObject
{
__weak NSString *str1;
__unsafe_unretained NSString *str2;
}
@property (nonatomic, weak) NSString *str3;
@property (nonatomic, unsafe_unretained) NSString *str4;
@end
बीच में अंतर weak
(__weak
) और unsafe_unretained
(__unsafe_unretained
) यह है कि जब वेरिएबल की ओर इशारा किया गया ऑब्जेक्ट डिलीकेट किया जा रहा है, तो वेरिएबल का मान बदला जा रहा है या नहीं। weak
लोगों को नल पॉइंटर | में अपडेट किया जाएगाnil
और यह unsafe_unretained
झूलने वाले सूचक के रूप में एक को अपरिवर्तित छोड़ दिया जाएगा। weak
मैक ओएस एक्स लायन | मैक ओएस एक्स 10.7 शेर और आईओएस 5 के साथ-साथ एक्सकोड 4.1 (आईओएस के लिए 4.2) और केवल एआरसी का उपयोग करते समय ऑब्जेक्टिव-सी में ई> संदर्भ जोड़े गए हैं। Mac OS X, iOS और GNUstep के पुराने संस्करण केवल समर्थन करते हैं unsafe_unretained
कमजोर के रूप में संदर्भ।
वाला (प्रोग्रामिंग लैंग्वेज)
class Node {
public weak Node prev; // a weak reference is used to avoid circular references between nodes of a doubly-linked list
public Node next;
}
पायथन
>>> import weakref
>>> import gc
>>> class Egg:
... def spam(self):
... print("I'm alive!")
...
>>> obj = Egg()
>>> weak_obj = weakref.ref(obj)
>>> weak_obj().spam()
I'm alive!
>>> obj = "Something else"
>>> gc.collect()
35
>>> weak_obj().spam()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'spam'
यह भी देखें
- शीतल संदर्भ
- प्रेत संदर्भ
- वृत्तीय संदर्भ
- पंचांग
संदर्भ
- ↑ 8.8. weakref — Weak references, The Python Standard Library
- ↑ "PHP: WeakReference - Manual".
- ↑ "प्रैक्टिकल मेमोरी प्रबंधन". developer.apple.com.
- ↑ Nicholas, Ethan (May 4, 2006). "कमजोर संदर्भों को समझना". java.net. Archived from the original on 2011-03-03. Retrieved October 1, 2010.
- ↑ Goldshtein, Zurbalev & Flatow 2012, p. 131.
- ↑ "WeakReference (Java Platform SE 7 )". docs.oracle.com.
- ↑ "सॉफ्ट रेफरेंस - एंड्रॉइड डेवलपर्स". developer.android.com.
- ↑ "PhantomReference (Java Platform SE 7 )". docs.oracle.com.
- ↑ https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples
- Goldshtein, Sasha; Zurbalev, Dima; Flatow, Ido (2012). Pro .NET Performance: Optimize Your C# Applications. Apress. ISBN 978-1-4302-4458-5.
बाहरी संबंध
सी ++
- सी++11 | सी++11 मानक पुस्तकालय:
std::weak_ptr
संदर्भ - बूस्ट (C++ लाइब्रेरी)|बूस्ट 1.59 (C++ लाइब्रेरी):
boost::weak_ptr
संदर्भ
जावा
- जावा डेवलपर लेख: 'संदर्भ वस्तुएं और कचरा संग्रह'
- Nicholas, Ethan (May 4, 2006). "कमजोर संदर्भों को समझना". java.net. Archived from the original on August 19, 2010. Retrieved October 1, 2010.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - RCache - कमजोर/सॉफ्ट संदर्भ आधारित कैश के लिए जावा लाइब्रेरी
- जावा सिद्धांत और व्यवहार: कमजोर संदर्भों के साथ मेमोरी लीक को प्लग करना
पीएचपी
पायथन
- कमजोर रेफरी - कमजोर संदर्भ - पायथन 3 प्रलेखन
- फ्रेड एल. ड्रेक, जूनियर, PEP 205: Weak References, पायथन एन्हांसमेंट प्रपोजल, जनवरी 2001।
श्रेणी:डेटा प्रकार
श्रेणी:स्मृति प्रबंधन