2011-12-12 10 views
7

संभव डुप्लिकेट:
How to avoid memory leaks in callback?कॉलबैक में मेमोरी लीक से बचें?

प्रभावी जावा का कहना है:

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

मैं इसे समझने में असमर्थ हूं। क्या कोई इसे समझा सकता है?

+0

इस प्रश्न का उत्तर यहां दिया गया है। http://stackoverflow.com/questions/2859464/how-to-avoid-memory-leaks-in-callback –

उत्तर

1

किसी ऑब्जेक्ट को कमजोर संदर्भ रखने से उसे कचरा बनने से रोका नहीं जाता है - यदि ऑब्जेक्ट के लिए कोई और मजबूत संदर्भ नहीं है, तो अंत में यह कचरा एकत्रित हो जाएगा और अब आप इसे WeakReference के माध्यम से एक्सेस नहीं कर पाएंगे आपने संग्रह किया है अधिक जानकारी के लिए Google Java weak references tutorial

1

इसका मतलब है: यदि श्रोता या कॉलबैक ऑब्जेक्ट के संदर्भ में संदर्भित होता है, तो संदर्भित ऑब्जेक्ट कभी भी जीसीड नहीं होगा क्योंकि श्रोता या कॉलबैक अभी भी वहां है और इस से ऑब्जेक्ट का संदर्भ है, जिससे मेमोरी लीक हो जाती है।

3

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

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

है यह सुनिश्चित करने के लिए अप्रयुक्त श्रोताओं को सही ढंग से हटा दिया जाता है।

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