2009-10-28 12 views
15

मैं हाल ही में वीक रेफरेंस के साथ जावा कोड के एक टुकड़े में आया - मैंने उन्हें कभी तैनात नहीं देखा था, हालांकि जब वे पेश किए गए थे तो मैं उनके पास आऊंगा। क्या यह ऐसा कुछ है जिसे नियमित रूप से उपयोग किया जाना चाहिए या केवल तभी जब कोई स्मृति समस्याओं में चलता है? यदि उत्तरार्द्ध, क्या उन्हें आसानी से फिर से लगाया जा सकता है या क्या कोड को गंभीर रिफैक्टरिंग की आवश्यकता है? क्या औसत जावा (या सी #) प्रोग्रामर आमतौर पर उन्हें अनदेखा कर सकता है?कमजोर संदर्भों का उपयोग कब किया जाना चाहिए?

EDIT क्या डब्लूआरएस के अत्यधिक उत्साही उपयोग से कोई नुकसान हो सकता है?

+0

http://stackoverflow.com/questions/1434156/other-uses-of-weak-references –

+0

पर कमजोर संदर्भों के लिए उपयोग के अधिक उदाहरण जोड़े, जहां तक ​​मुझे पता है कि डब्ल्यूआर के साथ एकमात्र खतरा यह है कि आप वास्तव में चाहते हैं एक * मजबूत * संदर्भ। अपने वस्तुओं गायब जब आप उन्हें नहीं करना चाहती आप बहुत दूर चले गए हैं सकता है के लिए शुरू करते हैं;) –

+0

आप जब उन्हें इस्तेमाल और कैसे करने के लिए पता करने के लिए है, और कुछ मामलों में यह रूप में पर ताला लगा के साथ multithreading में पाया इसी तरह के मुद्दों के लिए नीचे आता है डेटा। उदाहरण के लिए, यह एक (.NET नमूना) के लिए गलत है: 'अगर (x.IsAlive) {x.Target.ToString(); } 'क्योंकि इस दौरान वस्तु एकत्र की गई हो सकती है। आपको पहले एक मजबूत संदर्भ प्राप्त करना होगा और फिर जांचें कि यह अभी भी जीवित है या नहीं: 'ऑब्जेक्ट टी = एक्स। लक्ष्य; अगर (टी! = शून्य) {t.ToString(); } 'क्योंकि जैसे ही आपने वस्तु के लिए एक मजबूत संदर्भ पुनः प्राप्त किया है, यह एकत्र नहीं किया जाएगा। – Lucero

उत्तर

20

कमजोर संदर्भ कचरा संग्रह के बारे में हैं। मानक ऑब्जेक्ट "गायब नहीं होगा" जब तक कि इसके सभी संदर्भों को तोड़ दिया नहीं जाता है, इसका मतलब यह है कि कचरा संग्रह इसे कचरा मानने से पहले आपके विभिन्न ऑब्जेक्ट्स को हटा देना होगा।

एक कमजोर संदर्भ के साथ सिर्फ इसलिए कि आपकी ऑब्जेक्ट को अन्य ऑब्जेक्ट्स द्वारा संदर्भित किया गया है, इसका मतलब यह नहीं है कि यह कचरा नहीं है। यह अभी भी जीसी द्वारा उठाया जा सकता है और स्मृति से हटा दिया जा सकता है।

एक उदाहरण: यदि मेरे पास मेरे आवेदन में फू ऑब्जेक्ट्स का समूह है तो मैं अपने सभी फू के केंद्रीय रिकॉर्ड को रखने के लिए एक सेट का उपयोग करना चाहूंगा। लेकिन, जब मेरे आवेदन के अन्य हिस्सों में सभी संदर्भों को हटाकर एक फू ऑब्जेक्ट को हटा दिया जाता है, तो मैं नहीं चाहता कि शेष सेट उस ऑब्जेक्ट को उस कचरे में रखे ताकि उसे कचरा इकट्ठा किया जा सके! वास्तव में मैं बस अपने सेट से गायब होना चाहता हूँ। यह वह जगह है जहां आप कमजोर सेट (जावा के पास एक वीक हैशैप) की तरह कुछ उपयोग करेंगे, जो "मजबूत" संदर्भों के बजाय अपने सदस्यों के कमजोर संदर्भों का उपयोग करता है।

यदि आपकी ऑब्जेक्ट्स जब आप उन्हें चाहते हैं तो कचरा नहीं एकत्र किया जा रहा है, तो आपने अपनी पुस्तक को रखने में कोई त्रुटि की है, कुछ अभी भी एक संदर्भ है जिसे आप निकालना भूल गए हैं। कमजोर संदर्भों का उपयोग करने से इस तरह की किताब रखने के दर्द को कम किया जा सकता है, क्योंकि आपको उनके बारे में चिंता करने की ज़रूरत नहीं है, "ऑब्जेक्ट" और गैर-कचरा इकट्ठा करने के लिए, लेकिन में नहीं है।

15

जब भी आप वस्तु को जीवित रखने के बिना किसी ऑब्जेक्ट का संदर्भ रखना चाहते हैं तो आप उनका उपयोग करते हैं। यह कई कैशिंग जैसी सुविधाओं के लिए सच है, लेकिन ईवेंट हैंडलिंग में भी एक महत्वपूर्ण भूमिका निभाता है, जहां किसी ग्राहक को किसी ईवेंट की सदस्यता लेने के द्वारा जीवित नहीं रखा जाएगा।

एक छोटा सा उदाहरण: एक टाइमर ईवेंट जो कुछ डेटा को रीफ्रेश करता है। अधिसूचित होने के लिए कोई भी वस्तु टाइमर पर सब्सक्राइब कर सकती है, लेकिन टाइमर पर सब्सक्राइब किए गए नंगे तथ्य को उन्हें जीवित नहीं रखना चाहिए। तो टाइमर वस्तुओं के कमजोर संदर्भ होना चाहिए।

+1

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

+1

tackline - मैं के बारे में 'बहुत गलत' यकीन नहीं है - निश्चित रूप से अगर वे उपयोग किया जाता है, जब वे नहीं होना चाहिए, फिर ऐप्स विफल हो जाएगा - लेकिन यह है कि एक डिजाइन मुद्दा है, नहीं कुछ भी प्रति-se –

+0

मैं कमजोर संदर्भ के साथ क्या करना है मैं यह नहीं कह रहा हूं कि आपको किसी ऑब्जेक्ट को केवल एक कमजोर संदर्भ को थ्रूग करना चाहिए, बल्कि आप उन वस्तुओं के संदर्भ रखने के लिए उपयोग कर सकते हैं जहां उन्हें जीवित रखने की आपकी ज़िम्मेदारी नहीं है। आम तौर पर, वे वस्तुएं दृढ़ता से संदर्भित ऑब्जेक्ट ग्राफ़ का हिस्सा होंगी, लेकिन जब वह ग्राफ गुंजाइश से बाहर हो जाता है, तो कमजोर संदर्भ जीसी को उनको इकट्ठा करने में बाधा नहीं डालता है। यह हमेशा वही होता है: उचित उपकरण का उपयोग करें जहां वे फिट होते हैं। – Lucero

7

क्या कोई नुकसान डब्लूआरएस के अत्यधिक उत्साही उपयोग से किया जा सकता है?

हां यह कर सकता है।

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

एक दूसरी चिंता यह है कि कमजोर संदर्भों का उपयोग करने के साथ रनटाइम ओवरहेड हैं।स्पष्ट लागत कमजोर संदर्भ बनाने और उन पर get पर कॉल करने वाले हैं। एक कम स्पष्ट लागत यह है कि जीसी चलाने के हर बार महत्वपूर्ण अतिरिक्त काम करने की आवश्यकता होती है।

एक अंतिम चिंता यह है कि अगर आप कुछ है कि आपके आवेदन अत्यधिक भविष्य में जरूरत होने की संभावना है के लिए एक कमजोर संदर्भ का उपयोग, आप बार-बार पुनः बनाने का शुल्क लग सकते हैं है। यदि यह लागत अधिक है (सीपीयू समय, आईओ बैंडविड्थ, नेटवर्क यातायात, जो भी हो) के मामले में आपका आवेदन परिणामस्वरूप बुरी तरह प्रदर्शन कर सकता है। आप जेवीएम को और अधिक स्मृति देने से बेहतर हो सकते हैं और कमजोर संदर्भों का उपयोग नहीं कर सकते हैं।

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

1

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

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