"हाय! मैंने आपको कचरा संग्रह के बारे में एक और छोटा सबक देने का फैसला किया है।"

जैसा कि आप पहले से ही जानते हैं, जब कोई वस्तु अनावश्यक हो जाती है, तो जावा मशीन स्वयं निगरानी करती है और उसे हटा देती है।

"हाँ। आपने और ऋषि ने मुझे इसके बारे में पहले बताया था। मुझे विवरण याद नहीं है।"

"ठीक है। तो चलिए फिर से इस पर चलते हैं।"

कचरा संग्रहण - 1

"जैसे ही कोई वस्तु बनाई जाती है, JVM उसके लिए मेमोरी आवंटित करता है। संदर्भ चर का उपयोग करके वस्तु में रुचि की निगरानी की जाती है।  कचरा संग्रह के दौरान एक वस्तु को हटाया जा सकता है, अर्थात वह प्रक्रिया जिसके द्वारा स्मृति को जारी किया जाता है यदि कोई चर संदर्भित नहीं है वस्तु। "

"मुझे गारबेज कलेक्टर के बारे में थोड़ा बताएं- यह क्या है और यह कैसे काम करता है।"

"ठीक है। कचरा संग्रह मुख्य धागे पर होता था। हर 5 मिनट, या अधिक बार। यदि कभी भी पर्याप्त खाली मेमोरी नहीं होती, तो जावा मशीन सभी थ्रेड्स को निलंबित कर देती थी और अप्रयुक्त वस्तुओं को हटा देती थी।"

"लेकिन इस दृष्टिकोण को अब छोड़ दिया गया है। अगली पीढ़ी का कचरा संग्राहक पर्दे के पीछे और एक अलग थ्रेड पर काम करता है। इसे समवर्ती कचरा संग्रह कहा जाता है।"

"मैं देख रहा हूँ। किसी वस्तु को हटाने या न करने का निर्णय वास्तव में कैसा है?"

"किसी वस्तु के संदर्भों की संख्या की गणना करना बहुत प्रभावी नहीं है - ऐसी वस्तुएँ हो सकती हैं जो एक दूसरे को संदर्भित करती हैं, लेकिन किसी अन्य वस्तु द्वारा संदर्भित नहीं होती हैं।"

"तो जावा एक अलग दृष्टिकोण लेता है।  जावा ऑब्जेक्ट्स को रीचेबल और अनरीचेबल में विभाजित करता है।  एक ऑब्जेक्ट रीचेबल (जीवित) है अगर इसे किसी अन्य रीचेबल (जीवित) ऑब्जेक्ट द्वारा संदर्भित किया जाता है। रीचैबिलिटी थ्रेड्स से निर्धारित होती है। रनिंग थ्रेड्स को हमेशा रीचेबल (जीवित) माना जाता है। , भले ही कोई उनका संदर्भ न दे।"

"ठीक है। मुझे लगता है कि मैं समझ गया।"

"वास्तविक कचरा संग्रह कैसे होता है - अनावश्यक वस्तुओं का विलोपन?"

"यह सरल है। जावा में, मेमोरी को कन्वेंशन द्वारा दो भागों में विभाजित किया जाता है, और जब कचरा संग्रह का समय होता है, तो सभी जीवित (पहुंच योग्य) वस्तुओं को मेमोरी के दूसरे भाग में कॉपी किया जाता है, और पुरानी मेमोरी को छोड़ दिया जाता है।"

"यह एक दिलचस्प दृष्टिकोण है। संदर्भों को गिनने की आवश्यकता नहीं है: सभी पहुंच योग्य वस्तुओं की प्रतिलिपि बनाएँ, और बाकी सब कचरा है।"

"यह उससे थोड़ा अधिक जटिल है। जावा प्रोग्रामर ने पाया कि वस्तुओं को आमतौर पर दो श्रेणियों में विभाजित किया जाता है: लंबे समय तक रहने वाले (जो पूरे कार्यक्रम के चलने के दौरान मौजूद होते हैं) और अल्पकालिक (जो विधियों में आवश्यक होते हैं और «स्थानीय प्रदर्शन के लिए आवश्यक होते हैं। » संचालन)."

"दीर्घकालिक वस्तुओं को अल्पकालिक वस्तुओं से अलग रखना अधिक कुशल है। ऐसा करने के लिए, वस्तु की दीर्घायु निर्धारित करने के लिए एक तरीका खोजना आवश्यक था।"

"तो, उन्होंने सभी स्मृति को «पीढ़ियों» में विभाजित किया। पहली पीढ़ी की वस्तुएं, दूसरी पीढ़ी की वस्तुएं आदि हैं। हर बार स्मृति को साफ किया जाता है, पीढ़ी काउंटर को 1 से बढ़ाया जाता है। यदि कुछ वस्तुएं कई पीढ़ियों में मौजूद हैं, तो वे दीर्घजीवी के रूप में दर्ज हैं।"

"आज, कचरा संग्राहक जावा का एक बहुत ही जटिल और कुशल हिस्सा है। इसके कई हिस्से अनुमान लगाने वाले एल्गोरिदम पर आधारित ह्यूरिस्टिक रूप से काम करते हैं। नतीजतन, यह अक्सर उपयोगकर्ता को «सुनता नहीं है»।

"अर्थ?"

"Java में एक कचरा संग्राहक ( GC ) ऑब्जेक्ट है जिसे System.gc () विधि का उपयोग करके कॉल किया जा सकता है।"

"आप System.runFinalization () का उपयोग वस्तुओं को अंतिम रूप देने के तरीकों को हटाने के लिए मजबूर करने के लिए भी कर सकते हैं। लेकिन तथ्य यह है कि, जावा प्रलेखन के अनुसार, यह गारंटी है कि न तो कचरा संग्रह शुरू होगा, और न ही अंतिम रूप ( ) मेथड को कॉल किया जाएगा।  कचरा कलेक्टर तय करता है कि इसे कब और किस पर कॉल करना है। "

"वाह! जानकर अच्छा लगा।"

"लेकिन वहाँ अधिक है। जैसा कि आप जानते हैं, जावा में, कुछ ऑब्जेक्ट दूसरों को संदर्भित करते हैं। संदर्भों के इस नेटवर्क का उपयोग यह निर्धारित करने के लिए किया जाता है कि किसी वस्तु को हटाया जाना चाहिए या नहीं।"

"और, देखो। जावा में विशेष संदर्भ हैं जो आपको इस प्रक्रिया को प्रभावित करने देते हैं। उनके लिए विशेष आवरण वर्ग हैं। यहाँ वे हैं:"

" सॉफ्ट रेफरेंस  एक सॉफ्ट रेफरेंस है।"

" कमजोर संदर्भ  एक कमजोर संदर्भ है।"

" फैंटम रेफरेंस एक फैंटम रेफरेंस है।"

"उह... यह मुझे आंतरिक कक्षाओं, नेस्टेड कक्षाओं, नेस्टेड अज्ञात वर्गों और स्थानीय कक्षाओं की याद दिलाता है। नाम अलग हैं, लेकिन यह बिल्कुल स्पष्ट नहीं है कि वे किस लिए हैं।"

"कहो, अमीगो, तुम एक प्रोग्रामर बन गए हो। अब तुम वर्ग के नामों के कारण क्रोधित हो, यह कहते हुए कि «वे पर्याप्त जानकारीपूर्ण नहीं हैं, और एक नाम (!) के साथ यह निर्धारित करना असंभव है कि यह वर्ग क्या करता है, कैसे, और क्यों"।"

"वाह। मैंने नोटिस भी नहीं किया। लेकिन यह इतना स्पष्ट है।"

"ठीक है। बहुत शब्द। मैं आपको सॉफ्ट रेफरेंस के बारे में बताता हूं।"

"ये संदर्भ विशेष रूप से कैशिंग के लिए डिज़ाइन किए गए थे, हालांकि उनका उपयोग अन्य उद्देश्यों के लिए किया जा सकता है - सभी प्रोग्रामर के विवेक पर।"

"यहाँ इस तरह के संदर्भ का एक उदाहरण है:"

उदाहरण
// Create a Cat object
Cat cat = new Cat();

// Create a soft reference to a Cat object
SoftReference<Cat> catRef = new SoftReference<Cat>(cat);

// Now only the catRef soft reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the soft reference
catRef.clear();

"यदि किसी वस्तु का एकमात्र संदर्भ नरम है, तो यह जीवित रहता है और इसे 'नरम-पहुंच योग्य' कहा जाता है।"

"लेकिन!  प्रोग्राम में पर्याप्त मेमोरी नहीं होने पर केवल सॉफ्ट रेफरेंस द्वारा संदर्भित ऑब्जेक्ट को कचरा कलेक्टर द्वारा हटाया जा सकता है।  यदि अचानक प्रोग्राम में पर्याप्त मेमोरी नहीं है, तो OutOfMemoryException को फेंकने से पहले , कचरा कलेक्टर सभी ऑब्जेक्ट्स को हटा देगा सॉफ्ट रेफरेंस द्वारा संदर्भित और प्रोग्राम को मेमोरी आवंटित करने के लिए फिर से प्रयास करेगा।"

"मान लीजिए कि एक क्लाइंट प्रोग्राम अक्सर सर्वर प्रोग्राम से विभिन्न डेटा का अनुरोध करता है। सर्वर प्रोग्राम इसमें से कुछ को कैश करने के लिए सॉफ्ट रेफरेंस का उपयोग कर सकता है। यदि सॉफ्ट रेफरेंस द्वारा मौत से रखी गई वस्तुएं मेमोरी का एक बड़ा हिस्सा लेती हैं, तो कचरा कलेक्टर बस उन्हें हटा देता है। सब। यह सुंदर है!"

"हाँ। मुझे यह खुद पसंद आया।"

"ठीक है, एक छोटा सा जोड़: सॉफ्ट रेफरेंस क्लास में दो तरीके हैं। गेट () मेथड सॉफ्ट रेफरेंस द्वारा संदर्भित ऑब्जेक्ट को लौटाता है । यदि ऑब्जेक्ट को कचरा कलेक्टर द्वारा हटा दिया गया था, तो गेट () विधि अचानक वापस लौटना शुरू कर देगी।"

"उपयोगकर्ता स्पष्ट() विधि को कॉल करके स्पष्ट रूप से सॉफ़्ट रेफरेंस को भी साफ़ कर सकता है। इस मामले में, सॉफ़्ट रेफरेंस ऑब्जेक्ट के अंदर कमजोर लिंक नष्ट हो जाएगा।"

"अभी के लिए इतना ही।"

"दिलचस्प कहानी के लिए धन्यवाद, ऐली। यह वास्तव में बहुत दिलचस्प थी।"