[बस अंतिम प्रक्रिया के आंतरिक मामलों में आगे जोड़ना चाहता था]
तो, आप एक ऑब्जेक्ट बनाते हैं और जब ऑब्जेक्ट एकत्र किया जाता है, तो ऑब्जेक्ट की Finalize
विधि को बुलाया जाना चाहिए। लेकिन इस बहुत ही सरल धारणा की तुलना में अंतिम रूप देना अधिक है।
लघु अवधारणाओं ::
ऑब्जेक्ट्स Finalize
विधियों को लागू नहीं कर रहे हैं, वहां मेमोरी तुरंत पुनर्प्राप्त की जाती है, जब तक कि निश्चित रूप से, वे
अब एप्लिकेशन कोड द्वारा पहुंच योग्य नहीं हैं
को लागू करने ऑब्जेक्ट्स Finalize
विधि, संकल्पना / का कार्यान्वयन Application Roots
, Finalization Queue
, Freacheable Queue
इससे पहले कि वे पुन: दावा किया जा सकता है आता है।
किसी भी वस्तु को कचरा माना जाता है यदि यह अनुप्रयोग कोड द्वारा पहुंच योग्य नहीं है
मान लें: क्लास / ऑब्जेक्ट्स ए, बी, डी, जी, एच लागू नहीं है Finalize
विधि और सी, ई, एफ, आई, जे लागू Finalize
विधि।
जब कोई एप्लिकेशन एक नया ऑब्जेक्ट बनाता है, तो नया ऑपरेटर मेमोरी को ढेर से आवंटित करता है। यदि ऑब्जेक्ट के प्रकार में एक Finalize
विधि है, तो ऑब्जेक्ट के लिए एक पॉइंटर को अंतिम रूप देने वाली कतार पर रखा जाता है ।
इसलिए C, E, F, I, J की वस्तुओं की ओर इशारा करता है, इसे अंतिम रूप देने के लिए जोड़ा जाता है। अंतिम रूप दिए जाने के लिए कतार में एक आंतरिक डेटा कचरा कलेक्टर द्वारा नियंत्रित संरचना है। कतार में प्रत्येक प्रविष्टि किसी वस्तु की ओर इशारा करती है जो कि वस्तु की मेमोरी के पुनः प्राप्त होने से पहले उसकी विधि होनी चाहिए । नीचे चित्र कई वस्तुओं वाले ढेर को दर्शाता है। इनमें से कुछ ऑब्जेक्ट एप्लिकेशन की जड़ों से पहुंच योग्य हैं
Finalize
, और कुछ नहीं हैं। जब C, E, F, I और J को ऑब्जेक्ट बनाया जाता है, तो .नेट फ्रेमवर्क यह पता लगाता है कि इन ऑब्जेक्ट्स के Finalize
तरीके हैं और इन ऑब्जेक्ट्स के पॉइंटर्स को अंतिम रूप देने वाली कतार में जोड़ा जाता है ।
जब कोई GC (प्रथम संग्रह) होता है, तो वस्तुएँ B, E, G, H, I और J कचरा होने के लिए निर्धारित होती हैं। क्योंकि ए, सी, डी, एफ अभी भी ऊपर पीले बॉक्स से तीर के माध्यम से दर्शाए गए एप्लिकेशन कोड द्वारा पहुंच योग्य हैं।
कचरा संग्रहकर्ता इन वस्तुओं की ओर संकेत करने वाली अंतिम कतार को स्कैन करता है । जब एक पॉइंटर मिलता है, तो पॉइंटर को अंतिम रूप से कतार से हटा दिया जाता है और उसे दूर की कतार ("एफ- रीचेबल ") में जोड़ दिया जाता है । Freachable कतार एक और आंतरिक डेटा कचरा कलेक्टर द्वारा नियंत्रित संरचना है। भयावह कतार में प्रत्येक सूचक एक ऐसी वस्तु की पहचान करता है, जो अपनी विधि कहलाने के लिए तैयार है ।
Finalize
संग्रह (प्रथम संग्रह) के बाद, प्रबंधित ढेर नीचे की आकृति के समान दिखता है। नीचे दिए गए स्पष्टीकरण ::
1.) वस्तुओं बी, जी और एच द्वारा कब्जा की गई स्मृति को तुरंत पुनः प्राप्त किया गया है क्योंकि इन वस्तुओं में अंतिम विधि नहीं थी जिसे कहा जाना चाहिए ।
2.) हालाँकि, ऑब्जेक्ट E, I, और J द्वारा कब्जा की गई मेमोरी को दोबारा प्राप्त नहीं किया जा सकता क्योंकि उनकी Finalize
विधि को अभी तक नहीं बुलाया गया है।
अंतिम विधि को कॉल करने से दूर की कतार द्वारा किया जाता है ।
3.) ए, सी, डी, एफ अभी भी पीले बॉक्स से ऊपर तीर के माध्यम से दर्शाए गए एप्लिकेशन कोड द्वारा पहुंच योग्य हैं, इसलिए उन्हें किसी भी मामले में एकत्र नहीं किया जाएगा।
अंतिम रूप देने के तरीकों के लिए समर्पित एक विशेष रनटाइम थ्रेड है। जब अगम्य कतार खाली होती है (जो आमतौर पर मामला है), यह धागा सोता है। लेकिन जब प्रविष्टियां दिखाई देती हैं, तो यह थ्रेड जागता है, कतार से प्रत्येक प्रविष्टि को हटाता है, और प्रत्येक ऑब्जेक्ट की अंतिम विधि को कॉल करता है। कचरा संग्रहकर्ता पुनः प्राप्त करने योग्य मेमोरी को संकुचित करता है और विशेष रनटाइम थ्रेड प्रत्येक ऑब्जेक्ट की Finalize
विधि को निष्पादित करते हुए, दूर की कतार को खाली करता है । तो यहाँ अंत में है जब आपका अंतिम तरीका निष्पादित हो जाता है
अगली बार कचरा संग्रहकर्ता को (2 डी संग्रह) लगाया जाता है, यह देखता है कि अंतिम रूप से रखी गई वस्तुएं वास्तव में कचरा हैं, क्योंकि आवेदन की जड़ें इसे इंगित नहीं करती हैं और अगम्य कतार अब इसे इंगित नहीं करती है (यह भी बहुत अच्छा है), इसलिए ऑब्जेक्ट्स (E, I, J) के लिए मेमोरी को केवल Heap.See फिगर के नीचे से रिकवर किया गया है और इसे ऊपर दिए गए फिगर से तुलना करें
यहां समझने वाली महत्वपूर्ण बात यह है कि अंतिम रूप से आवश्यक वस्तुओं द्वारा उपयोग की जाने वाली स्मृति को पुनः प्राप्त करने के लिए दो जीसी की आवश्यकता होती है । वास्तव में, दो से अधिक संग्रह टैक्सी की आवश्यकता होती है क्योंकि इन वस्तुओं को एक पुरानी पीढ़ी को बढ़ावा मिल सकता है
नोट :: freachable कतार एक रूट वैश्विक और स्थैतिक चर की तरह जड़ें हैं माना जाता है। इसलिए, यदि कोई वस्तु विचारणीय कतार पर है, तो वह वस्तु उपलब्ध नहीं है और कचरा नहीं है।
अंतिम नोट के रूप में, याद रखें कि डिबगिंग एप्लिकेशन एक चीज है, कचरा संग्रह एक और चीज है और अलग तरह से काम करती है। अभी तक आप केवल डिबगिंग एप्लिकेशन द्वारा कचरा संग्रह नहीं कर सकते हैं, आगे अगर आप चाहते हैं कि मेमोरी की जांच यहां शुरू हो।