क्या कोई नुकसान डब्लूआरएस के अत्यधिक उत्साही उपयोग से किया जा सकता है?
हां यह कर सकता है।
एक चिंता यह है कि कमजोर संदर्भ आपके कोड को अधिक जटिल और संभावित रूप से त्रुटि उत्पन्न करते हैं। किसी भी कोड जो कमजोर संदर्भ का उपयोग करता है, इस संभावना से निपटने की आवश्यकता है कि जब भी इसका उपयोग होता है तो संदर्भ टूट गया है। यदि आप कमजोर संदर्भों का अधिक उपयोग करते हैं तो आप बहुत सारे अतिरिक्त कोड लिखते हैं। (आप जांच के ख्याल रखने वाली विधि के पीछे प्रत्येक कमजोर संदर्भ को छिपाकर इसे कम कर सकते हैं, और मांग पर त्याग किए गए ऑब्जेक्ट को फिर से बना सकते हैं। लेकिन यह आवश्यक रूप से उतना आसान नहीं हो सकता है, उदाहरण के लिए यदि पुन: निर्माण प्रक्रिया में नेटवर्क शामिल है पहुंच, आपको पुन: निर्माण विफलता की संभावना से निपटने की आवश्यकता है।)
एक दूसरी चिंता यह है कि कमजोर संदर्भों का उपयोग करने के साथ रनटाइम ओवरहेड हैं।स्पष्ट लागत कमजोर संदर्भ बनाने और उन पर get
पर कॉल करने वाले हैं। एक कम स्पष्ट लागत यह है कि जीसी चलाने के हर बार महत्वपूर्ण अतिरिक्त काम करने की आवश्यकता होती है।
एक अंतिम चिंता यह है कि अगर आप कुछ है कि आपके आवेदन अत्यधिक भविष्य में जरूरत होने की संभावना है के लिए एक कमजोर संदर्भ का उपयोग, आप बार-बार पुनः बनाने का शुल्क लग सकते हैं है। यदि यह लागत अधिक है (सीपीयू समय, आईओ बैंडविड्थ, नेटवर्क यातायात, जो भी हो) के मामले में आपका आवेदन परिणामस्वरूप बुरी तरह प्रदर्शन कर सकता है। आप जेवीएम को और अधिक स्मृति देने से बेहतर हो सकते हैं और कमजोर संदर्भों का उपयोग नहीं कर सकते हैं।
जरुर, इसका मतलब यह नहीं है कि आप पूरी तरह से कमजोर संदर्भों का उपयोग से बचना चाहिए। बस आपको सावधानी से सोचने की जरूरत है। और शायद आपको यह पता लगाने के लिए कि आपके मेमोरी उपयोग की समस्याएं कहां से आती हैं, आपको पहले अपने एप्लिकेशन पर एक मेमोरी प्रोफाइलर चलाया जाना चाहिए।
स्रोत
2009-10-29 00:47:52
http://stackoverflow.com/questions/1434156/other-uses-of-weak-references –
पर कमजोर संदर्भों के लिए उपयोग के अधिक उदाहरण जोड़े, जहां तक मुझे पता है कि डब्ल्यूआर के साथ एकमात्र खतरा यह है कि आप वास्तव में चाहते हैं एक * मजबूत * संदर्भ। अपने वस्तुओं गायब जब आप उन्हें नहीं करना चाहती आप बहुत दूर चले गए हैं सकता है के लिए शुरू करते हैं;) –
आप जब उन्हें इस्तेमाल और कैसे करने के लिए पता करने के लिए है, और कुछ मामलों में यह रूप में पर ताला लगा के साथ multithreading में पाया इसी तरह के मुद्दों के लिए नीचे आता है डेटा। उदाहरण के लिए, यह एक (.NET नमूना) के लिए गलत है: 'अगर (x.IsAlive) {x.Target.ToString(); } 'क्योंकि इस दौरान वस्तु एकत्र की गई हो सकती है। आपको पहले एक मजबूत संदर्भ प्राप्त करना होगा और फिर जांचें कि यह अभी भी जीवित है या नहीं: 'ऑब्जेक्ट टी = एक्स। लक्ष्य; अगर (टी! = शून्य) {t.ToString(); } 'क्योंकि जैसे ही आपने वस्तु के लिए एक मजबूत संदर्भ पुनः प्राप्त किया है, यह एकत्र नहीं किया जाएगा। – Lucero