सबसे पहले, याद रखें कि अंतिम रूप से आपके सभी ऑब्जेक्ट्स के लिए अंतिम रूप भी चलाना होगा। आप इसे ऑब्जेक्ट से जुड़े देशी कोड में आवंटित मुक्त मेमोरी के लिए उपयोग कर सकते हैं, लेकिन शुद्ध जावा कोड के लिए अधिकांश उपयोग के मामले केवल संसाधनों की सफाई के "बैकअप" तंत्र को करने के लिए होते हैं। इसका मतलब है कि ज्यादातर मामलों में आपको संसाधनों को मैन्युअल रूप से मुक्त करना चाहिए और अंतिम रूप से इसे साफ करने के लिए फाइनलर्स केवल एक प्रकार का सहायक काम कर सकते हैं यदि आप इसे मानक तरीके से करना भूल जाते हैं। हालांकि, आप उन्हें सफाई के एकमात्र या मुख्य तंत्र के रूप में उपयोग नहीं कर सकते हैं। इससे भी आम तौर पर, आपको कोई भी कोड नहीं लिखना चाहिए जिसका शुद्धता अंतिम रूप से चलने वाले पर निर्भर करता है।
विज्ञापन 1।जहां तक मुझे पता है, इस बात की कोई गारंटी नहीं है कि थ्रेड finalize()
पर कॉल करता है, हालांकि व्यवहार में यह शायद जीसी धागे में से एक होगा।
विज्ञापन 2. नई वस्तुओं को इंस्टेंट करने की अनुमति है। हालांकि, अंतिम रूप में ऑब्जेक्ट संदर्भों को संभालने के साथ कई नुकसान हैं। विशेष रूप से, यदि आप किसी लाइव ऑब्जेक्ट में ऑब्जेक्ट को अंतिम रूप देने के लिए एक कठिन संदर्भ संग्रहीत करते हैं, तो आप अपने कचरे से एकत्रित वस्तु को साफ होने से रोक सकते हैं। इस तरह के ऑब्जेक्ट पुनरुत्थान से आपके संसाधनों को समाप्त हो सकता है यदि यह नियंत्रण से बाहर हो जाता है। साथ ही, finalize()
में अपवादों के लिए देखें - वे अंतिम रूप को रोक सकते हैं, लेकिन आपके प्रोग्राम के बारे में जानने के लिए कोई स्वचालित तरीका नहीं है। आपको कोड को पकड़ने वाले ब्लॉक में लपेटने और स्वयं को जानकारी प्रसारित करने की आवश्यकता है। इसके अलावा, फाइनलाइजर्स के लंबे निष्पादन समय से ऑब्जेक्ट्स की कतार का निर्माण हो सकता है और बहुत सारी मेमोरी का उपभोग हो सकता है। this JavaWorld article में कुछ अन्य उल्लेखनीय समस्याओं और सीमाओं का वर्णन किया गया है।
विज्ञापन 3. अंतिमकर्ताओं से स्थैतिक तरीकों को कॉल करने के साथ कोई समस्या नहीं होनी चाहिए।
विज्ञापन 4. जैसा कि बिंदु 2 में उल्लिखित है, किसी ऑब्जेक्ट को अंतिमकरण के दौरान किसी अन्य लाइव ऑब्जेक्ट में संदर्भ डालकर एकत्रित कचरा (इसे पुनर्जीवित करने) से रोकना संभव है। हालांकि, यह मुश्किल व्यवहार है और शायद अच्छा अभ्यास नहीं है।
समेकित करने के लिए, आप अपने संसाधनों की सफाई के लिए अंतिमकर्ताओं पर भरोसा नहीं कर सकते हैं। आपको अपने मामले में मैन्युअल रूप से और फ़ाइनलाइज़र को संभालने की आवश्यकता है, कुछ डिग्री के लिए मैला कोडिंग के बाद कवर करने के लिए बैकअप तंत्र के रूप में सबसे अच्छा उपयोग किया जा सकता है। इसका मतलब है, दुर्भाग्यवश, ओपनजीएल संसाधनों को साफ करने के लिए अंतिमकर्ताओं का उपयोग करके एपीआई निसर बनाने का आपका विचार शायद काम नहीं करेगा।
स्रोत
2012-03-04 17:23:18
यह आपके प्रश्न का सीधा जवाब नहीं है, लेकिन पता है कि अंतिम रूप देने के लिए कभी भी गारंटी नहीं दी जाती है, जो कि कई कारणों में से एक है जिसका उपयोग भारी रूप से नहीं किया जाता है। (संपादित करें: और यहां तक कि यदि यह है, तो जावा-प्रबंधित मेमोरी में मेमोरी प्रेशर के कारण इसे कॉल किया जाएगा। इसका मतलब है कि यदि आप इसे अन्य संसाधनों को मुक्त करने के लिए उपयोग करने का प्रयास कर रहे हैं, तो आप उनमें से बाहर हो सकते हैं और आपके प्रोग्राम क्रैश होने के बावजूद क्लीनअप उन सभी को पुनः प्राप्त कर सकता है, सिर्फ इसलिए कि जावा को पता नहीं है कि जीसी चलाने से पुनः दावा होगा (उदाहरण के लिए) फ़ाइल हैंडल।) – jacobm