java अनाम वर्ग के निर्माणकर्ता में अंतिम वस्तु के संदर्भ में एक रिसाव?




android memory-leaks (3)

मैं एक सेवा के लिए एक runnable पारित कर रहा हूँ रननेबल अवधि उस अंश / गतिविधि से निकल सकती है जो उसे पास करती है। मैं सोच रहा हूं कि क्या निम्न कोड स्निपेट रननबल के भीतर एक संदर्भ बनाए रखने से frag ऑब्जेक्ट रिसाव करेगा? मुझे एहसास हुआ कि मैं पूरी तरह से बाहर की रेखा को स्थानांतरित कर सकता हूँ जिसमें सुरंग के बाहर (जैसा कि मैंने "स्ट्रिंग कुंजी = फ्रैग ..." के साथ किया था), लेकिन मैं यह समझने के लिए बस पूछ रहा हूँ कि कैसे / जब एक गुमनाम वर्ग लीक करेगा वस्तु।

मैं वास्तव में निश्चित नहीं हूँ चलाने के लिए केवल आवेश को आरम्भ करने पर एक चर का निर्धारण करने की आवश्यकता होती है, और यहां इन-लाइन को आरम्भिक किया गया है इसलिए सिद्धांत रूप में, इन-लाइन उदाहरण बनाने के बाद इसे किसी भी संदर्भ के लिए frag की कोई ज़रूरत नहीं है।

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

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){

    final String key = frag.getCastedActivity().getKey();

    Runnable rx_downloadFile = new Runnable() {

        Context ServiceContext = frag.getCastedActivity().mService;

        @Override
        public void run() {

            bg_downloadFile(ServiceContext, key, file, drive);
        }
    }; 

    //.... Submit runnable to service...
}

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

यह कहने के बाद, इसका मतलब है कि वास्तव में उदाहरण क्षेत्रों (आपके रननबल में) बाहरी दायरे के सभी एक्सेस किए गए चर की प्रतियां हैं। आपके उदाहरण में, यह FragMyDrive संदर्भ में भी होगा क्योंकि आप बस इसे एक्सेस कर रहे हैं।

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

आप वास्तव में क्या जरूरत है उन संदर्भों को कम करने के लिए हमेशा एक अच्छा विचार है:

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){
    final String key = frag.getCastedActivity().getKey();
    final Context context = frag.getCastedActivity().mService;

    Runnable rx_downloadFile = new Runnable() {
        @Override
        public void run() {
            bg_downloadFile(context, key, file, drive);
        }
    }; 
    //.... Submit runnable to service...
}

यहां केवल (अंतर्निहित रूप से उत्पन्न) इंस्टेंस फ़ील्ड हैं:

String key
Context context
File file
Drive drive

मुझे यकीन नहीं है कि मैं आपके इनलाइन शब्द को सही ढंग से समझता हूं लेकिन किसी भी स्थिति में, मुझे नहीं लगता कि यहां कुछ भी लीक हो गया है।

वार final String key आपके स्थैतिक फ़ंक्शन fg_downloadFile() में केवल एक स्थानीय संदर्भ है, इसलिए फ़ंक्शन के अंत में दायरे से बाहर निकलने पर इसे मुक्त किया जाता है।

Runnable इनर क्लास अभी तक Runnable धागा जीवन के लिए जब तक एक संदर्भ (फिर से नहीं, लेकिन इसमें कुछ उप-संपत्ति के लिए) को पकड़ सकता है (अधिक सटीक, कंपाइलर वास्तव में एक कंस्ट्रक्टर और final सदस्य चर के साथ Runnable implementation उत्पन्न करता है जो कि किसी भी निहित उपयोग किए गए संदर्भों को जो कि fg_downloadFile() के दायरे में उपलब्ध है, fg_downloadFile() है।)

लेकिन किसी भी मामले में, सभी कोड निष्पादित होने के बाद, (उप-सदस्य) frag सभी संदर्भ निकाल दिए जाएंगे और कचरा कलेक्टर कचरा उठा सकते हैं।

उम्मीद है की यह मदद करेगा।


दिलचस्प सवाल क्या आपको प्रोग्रामिंग में स्वत: कचरा संग्रह के बिना कुछ अनुभव है, जैसे उद्देश्य सी?

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

चूंकि कचरा संग्रह काम करता है, एक बार वस्तु का संदर्भ नहीं दिया जाता है, यह कचरा संग्रहण और डिलोकेटेड होगा।





anonymous-class