2009-04-23 22 views
16

मुझे आश्चर्य है कि कमजोर संदर्भ आंतरिक रूप से कैसे काम करते हैं, उदाहरण के लिए .NET या जावा में। मेरे दो सामान्य विचार हैं:कमजोर संदर्भ कैसे लागू किए जाते हैं?

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

इनमें से कोई भी समाधान साफ ​​और न ही कुशल लगता है। क्या किसी को पता है कि यह वास्तव में कैसे किया जाता है?

उत्तर

5

सुनिश्चित नहीं है कि मैं आपका प्रश्न समझ गया हूं, लेकिन आप क्लास वीक रेफरेंस और जावा में इसके सुपरक्लास संदर्भ के कार्यान्वयन पर एक नज़र डाल सकते हैं। यह अच्छी तरह से टिप्पणी की गई है और आप देख सकते हैं कि इसका विशेष रूप से जीसी द्वारा इलाज किया गया क्षेत्र है और दूसरा वीएम द्वारा सीधे इस्तेमाल किया जाता है।

+0

मिला: http://java.sun.com/j2se/1.5.0/source_license.html –

+0

यहां सबसे नया: http://download.java.net/openjdk/jdk7/ –

6

.NET में, जब WeakReference बनाया गया है, तो जीसी को संदर्भ का प्रतिनिधित्व करने वाले हैंडल/अपारदर्शी टोकन के लिए कहा जाता है। फिर, जब आवश्यक हो, WeakReference जीसी से पूछने के लिए इस हैंडल का उपयोग करता है यदि वह हैंडल अभी भी मान्य है (यानी मूल वस्तु अभी भी मौजूद है) - और यदि ऐसा है, तो यह वास्तविक ऑब्जेक्ट संदर्भ प्राप्त कर सकता है।

तो यह टोकन/वस्तु पतों के खिलाफ संभालती है की एक सूची बनाने जा रहा है (और शायद defragmentation आदि के दौरान उस सूची को बनाए रखने)

मुझे यकीन है कि मैं 100% तीन गोलियों समझ में नहीं हूँ, इसलिए मुझे लगता है कि करने में संकोच जो (यदि कोई है) जो निकटतम है।

+0

एक संभावित समस्या यह निर्धारित कर रही है कि टोकन मूल वस्तु या किसी नई वस्तु को संदर्भित करता है जो स्मृति में समान स्थान पर कब्जा करने के लिए होता है। मुझे लगता है कि मौजूदा कार्यान्वयन कॉलबैक का उपयोग करते हैं जो ऑब्जेक्ट को अंतिम रूप देने पर कमजोर संदर्भ को अमान्य करता है। –

+2

एक कॉम्पैक्टिंग जीसी को वैसे भी उस समस्या का हल करने की आवश्यकता है, क्योंकि यह हर समय वस्तुओं को भी स्थानांतरित करता है। –

2

पायथन के PEP 205 में पाइथन में कमजोर संदर्भों का व्यवहार करने का एक सभ्य स्पष्टीकरण है, और इससे कुछ अंतर्दृष्टि मिलती है कि उन्हें कैसे कार्यान्वित किया जा सकता है। चूंकि एक कमजोर संदर्भ अपरिवर्तनीय है, इसलिए आपके पास प्रत्येक ऑब्जेक्ट के लिए केवल एक ही हो सकता है, जिसके लिए आप आवश्यक संदर्भों को पार करते हैं। इस प्रकार, जब वस्तु नष्ट हो जाती है, केवल एक कमजोर संदर्भ को अमान्य करने की आवश्यकता होती है।

0

सामान्य दृष्टिकोण, मुझे लगता है कि प्रणाली कमजोर संदर्भों की किसी प्रकार की सूची को बनाए रखने के लिए है। जब कचरा कलेक्टर निष्पादित होता है, मृत वस्तुओं को हटा दिए जाने से पहले, सिस्टम कमजोर संदर्भों की सूची के माध्यम से पुनरावृत्ति करता है और किसी भी संदर्भ को अमान्य करता है जिसका लक्ष्य लाइव टैग नहीं किया गया है। सिस्टम के आधार पर, यह सिस्टम अस्थायी रूप से उन वस्तुओं को पुन: सक्रिय कर सकता है जो तत्काल अंतिमकरण के लिए योग्य हैं (.NET के मामले में, दो प्रकार के WeakReference हैं - जिनमें से एक को प्रभावी रूप से सिस्टम स्कैन करने वालों के लिए स्कैन करने से पहले संसाधित किया जाता है , जिसका अर्थ है कि यह लक्ष्य अमान्य हो जाएगा जब इसका लक्ष्य अंतिम रूप देने के लिए योग्य हो जाता है, और इनमें से एक के बाद संसाधित किया जाता है)।

संयोग से, अगर मैं एक जीसी आधारित ढांचे को डिजाइन किया गया है, मैं अन्य उपहार की एक जोड़ी जोड़ना होगा: (1) एक संदर्भ किसी के हित के लिए मुख्य रूप से है कि पकड़े के रूप में एक संदर्भ प्रकार भंडारण स्थान घोषित करने का एक साधन अन्यथा, और (2) WeakReference की एक किस्म जो इंगित करेगी कि किसी ऑब्जेक्ट का एकमात्र संदर्भ "किसी और के लिए ब्याज" भंडारण स्थानों में है।यद्यपि WeakReference एक उपयोगी प्रकार है, एक मजबूत संदर्भ में एक कमजोर संदर्भ को बदलने का कार्य प्रणाली को कभी भी यह पहचानने से रोक सकता है कि यदि कोई लक्ष्य गायब हो जाता है तो कोई भी दिमाग में नहीं होगा।

2

ऐसा लगता है कि कमजोर संदर्भों का कार्यान्वयन उद्योग में अच्छी तरह से गुप्त रखा गया है ;-)। उदाहरण के लिए, अब तक, wikipedia article में कोई कार्यान्वयन विवरण नहीं है। और ऊपर दिए गए उत्तरों को देखें (स्वीकार किए गए सहित): "स्रोत को देखें" या "मुझे लगता है"; - \।

सभी उत्तरों में से केवल पाइथन के पीईपी 205 का संदर्भ देने वाला व्यक्ति अंतर्दृष्टिपूर्ण है। जैसा कि यह कहता है, किसी एक वस्तु के लिए, सबसे कमजोर संदर्भ हो सकता है, अगर हम कमजोर को एक इकाई के रूप में देखते हैं।

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

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

और ऑब्जेक्ट के कमजोर होने के लिए पॉइंटर है, तो ऑब्जेक्ट अपने आप में कमजोर पड़ सकता है नाशक।

यह कार्यान्वयन बहुत साफ है (कोई जादू "जीसी में कॉल नहीं करता है" और सामान) और ओ (1) रनटाइम लागत है। बेशक, यह स्मृति की बहुत लालची है - प्रत्येक ऑब्जेक्ट में +1 पॉइंटर फ़ील्ड जोड़ने की आवश्यकता है, भले ही आमतौर पर 90 +% ऑब्जेक्ट्स के लिए न्यूल हो। बेशक, वीएचएलएल में पहले से ही प्रति वस्तु बड़ी मेमोरी ओवरहेड है, और अलग-अलग "अतिरिक्त" फ़ील्ड को कॉम्पैक्ट करने का मौका हो सकता है। उदाहरण के लिए, ऑब्जेक्ट प्रकार आमतौर पर एक छोटी गणना होती है, इसलिए एकल मशीन शब्द में टाइप और कुछ प्रकार के कमजोर संदर्भ को मर्ज करना संभव हो सकता है (कहें, एक अलग क्षेत्र में कमजोर वस्तुओं को रखें, और उसमें इंडेक्स का उपयोग करें)।

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