2011-12-12 12 views
17

मैं इस सवाल है कि ऐसे ही पूछ लिया गया पढ़ रहा था:, Avoid memory leaks in callbacks?अज्ञात श्रोताओं कमजोर संदर्भों के साथ असंगत हैं?

और मैं काफी उलझन में था जब तक किसी को जवाब निम्नलिखित:

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

हूँ मैं मेरी समझ में सही करते समय जब एक WeakHashMap में संग्रहीत की तरह, एक कमजोर संदर्भों का उपयोग कि, अनाम श्रोताओं के साथ असंगत है?

मैं आम तौर पर इस तरह श्रोताओं पारित:

public static void main(String[] args) { 
    final Observable obs = new SomeObservable(); 
    obs.addObserver(new Observer() { 
     public void update(final Observable o, final Object arg) { 
      System.out.println("Notified"); 
     } 
    }); 
    obs.notifyObservers(); 
    ... // program continues its life here 
} 

private static final class SomeObservable extends Observable { 

    @Override 
    public void addObserver(final Observer o) { 
     super.addObserver(o); 
     setChanged(); // shouldn't be done from here (unrelated to the question) 
    } 

} 

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

बोनस प्रश्न के रूप में: अज्ञात श्रोता के संदर्भ में जीसी के लिए पात्र कब होना चाहिए अवलोकन विषय एक कमजैश मैप का उपयोग करना चाहिए? जब मुख्य विधि निकलती है? जैसे ही obs.addObserver कॉल खत्म हो गया है?

मैं थोड़ा उलझन में हूं कि अज्ञात वर्ग के उदाहरणों के संदर्भ में/कैसे/कब जीसी के लिए संग्रहीत/संग्रहीत किया जाता है।

जाहिर है अगर मैं सामान्य संदर्भ रख रहा हूं तो यह जीसी के लिए योग्य नहीं है, लेकिन जब यह वीक हैशैप में होता है, तो ठीक कब श्रोता जीसी के लिए समझदार हो जाता है?

उत्तर

3

एक वस्तु केवल एक WeakHashMap की एक प्रमुख है, तो यह पात्र और अगले जीसी पर साफ होने की संभावना है।

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

+1

आपकी मदद के लिए धन्यवाद, मैं समझता हूं।लेकिन मेरा प्रश्न वास्तव में अज्ञात श्रोताओं से संबंधित है: यदि मैं वीकशैश मैप में एक अज्ञात श्रोता का संदर्भ डालता हूं, तो क्या उस अज्ञात श्रोता के लिए कहीं और रखा गया है? यदि नहीं, तो जीसी के लिए कौन सा पल समझदार हो गया है? किस कॉल के बाद? –

6

हां, आप सही हैं, सुनने वालों को कमजोर संदर्भों के साथ श्रोताओं को बनाए रखना (जैसे वीकशैश मैप) को उनके स्वतंत्र दृढ़ता की आवश्यकता होती है। श्रोता पदानुक्रमों के लिए इस्तेमाल किया जा सकता है जहां श्रोता के बच्चे और माता-पिता होते हैं।

गैर-वीक रेफरेंस के लिए एक स्पष्ट निकालने का उपयोग करने वाले लिस्टर को बुलाया जाना चाहिए। जब तक श्रोता वस्तु तब तक सुन सकती है जब तक श्रोताओं योग्य वस्तु न हो। अधिकांश उपयोग मामलों में जो ठीक है, और एक अज्ञात वर्ग करेगा।

गुमनाम वर्ग उदाहरणों के साथ

एक रिसाव (जीसी रोकथाम) तभी हो सकता है जब वर्ग शरीर के बाहर एक अंतिम वस्तु तक पहुँचने।

नोट: WeakHashMap i.a. Map.Entry के अपने उप-वर्ग के लिए कमजोर संदर्भों का उपयोग करता है। जो कभी-कभी काफी दिमागी दबदबा हो सकता है।

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