2010-03-10 10 views
13

जावा में नरम संदर्भ के लिए उपयोग केस क्या है? जेवीएम को बंद करने से पहले महत्वपूर्ण जानकारी को डंप करने के लिए पर्याप्त संसाधनों को मुक्त करने के लिए जेवीएम मेमोरी से बाहर हो जाने पर कचरा गैर-महत्वपूर्ण वस्तुओं को एकत्रित करने के लिए उपयोगी होगा?जावा में नरम संदर्भ के लिए उपयोग केस क्या है?

क्या वे नरम-संदर्भ कहलाते हैं, जब वे "तनाव में डालते हैं" यानी: जेवीएम स्मृति से बाहर हो जाता है। मैं कमजोर संदर्भ और प्रेत संदर्भों को समझता हूं लेकिन वास्तव में जब इनकी आवश्यकता नहीं होती है।

उत्तर

16

एक उपयोग कैशिंग के लिए है। कल्पना कीजिए कि आप बड़ी वस्तुओं के इन-मेमोरी कैश को बनाए रखना चाहते हैं, लेकिन आप नहीं चाहते हैं कि कैश मेमोरी का उपभोग करे जो अन्य उद्देश्यों के लिए इस्तेमाल किया जा सके (कैश के लिए हमेशा पुनर्निर्मित किया जा सकता है)। वस्तुओं के नरम संदर्भों के कैश को बनाए रखने के द्वारा, संदर्भित वस्तुओं को JVM द्वारा मुक्त किया जा सकता है और वे अन्य उद्देश्यों के लिए पुन: उपयोग की गई स्मृति को मुक्त कर सकते हैं। जब उन्हें मुठभेड़ होती है तो कैश को केवल टूटे मुलायम संदर्भों को साफ़ करने की आवश्यकता होती है।

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

+0

बस जोड़ने के लिए, ऐसा लगता है कि मुलायम संदर्भ सिद्धांत रूप में लिनक्स (या किसी अन्य ओएस) की स्मृति प्रबंधन प्रणाली के समान हैं जहां पृष्ठों को मांग पर लोड किया जाता है। बस लिनक्स कई पेज प्रतिस्थापन एल्गोरिदम लागू कर सकता है। जावा कचरा कलेक्टर के बारे में क्या? क्या यह (या इसे कॉन्फ़िगर किया जा सकता है) कचरा संग्रहण के लिए सॉफ्ट संदर्भ का चयन करने के लिए वस्तुओं के उपयोग के पैटर्न का उपयोग करें?सारांश के लिए –

3

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

16

This article ने मुझे उनमें से प्रत्येक (कमजोर, मुलायम और प्रेत संदर्भ) की अच्छी समझ दी। यहाँ एक संक्षेप का हवाला देते है:

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

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

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

+0

+1 :) यही वह पाठ है जिसे मैं ढूंढ रहा हूं: पी प्रेत संदर्भों के लिए ... यह बहुत अजीब लग रहा है, मुझे लगता है कि इसका मुख्य उद्देश्य डिबगिंग टूल या चीजों जैसी चीजों के लिए एक आर्टिफैक्ट के रूप में कार्य करना है उस। – OscarRyz

+1

@ ऑस्कर: मानक 'अंतिमकरण' विधि से सुरक्षित अंतिमकरण बनाने के लिए प्रेत संदर्भों का भी उपयोग किया जा सकता है (मैंने इसे एक प्रोफाइलिंग टूल सहायता टेक्स्ट में पढ़ा लेकिन यहां कुछ चर्चा मिली - http://code-o-matic.blogspot.com /2009/01/subtleties-of-phantomreference-and.html)। –

0

कैश के रूप में सॉफ़्ट रेफरेंस का उपयोग कैसे किया जा सकता है इसका एक उदाहरण इस post में पाया जा सकता है।

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