.net - जड़ों क्या हैं?




garbage-collection jvm (4)

जड़ें या कचरा संग्रह जड़ों वे वस्तुएं हैं जो हमेशा पहुंच योग्य होती हैं । यदि कोई वस्तु हमेशा पहुंच योग्य होती है, तो यह कचरा संग्रह के लिए योग्य नहीं है; इसलिए जड़ों संग्रह के लिए हमेशा अयोग्य हैं। यह वस्तुओं का प्रारंभिक सेट है जहां से ढेर पर अन्य सभी वस्तुओं की पहुंच योग्यता निर्धारित की जाती है।

कचरा संग्रह जड़ों से पहुंचने वाले ढेर पर अन्य वस्तुओं को जीवित वस्तुओं माना जाता है, और संग्रह के लिए अयोग्य; उन वस्तुओं को जो पहुंचने योग्य नहीं हैं उन्हें पुनः दावा के लिए चिह्नित किया जा सकता है।

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

मुझे उम्मीद है कि यह जड़ (सेट) और लाइव ऑब्जेक्ट क्या है, इस पर किसी भी झूठे संदेह को साफ़ करता है।

कचरा संग्रह में जड़ें क्या हैं?

मैंने रूट की परिभाषा को "किसी भी संदर्भ के रूप में उपयोग किया है" के रूप में पढ़ा है और लाइव की परिभाषा यह है कि एक ऑब्जेक्ट जिसका उपयोग किया जा रहा है, जो एक स्थानीय चर, स्थैतिक चर हो सकता है।

मैं जड़ और जीवित वस्तुओं के बीच अंतर को भेदभाव करने के साथ थोड़ा उलझन में हूं।

रूट करने का मार्ग क्या है? रूट और लाइव ऑब्जेक्ट्स कैसे काम करता है?

क्या कोई विस्तार कर सकता है?


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

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


यदि आप पेड़ के रूप में स्मृति में वस्तुओं के बारे में सोचते हैं, तो "जड़ों" रूट नोड्स होंगे - प्रत्येक ऑब्जेक्ट आपके प्रोग्राम द्वारा तुरंत सुलभ होगा।

Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();

चार वस्तुएं हैं; एक व्यक्ति, एक लाल कार, इसका इंजन और सींग। संदर्भ ग्राफ ड्रा करें:

     Person [p]
        |
     Car (red)
   /           \
Engine    AnnoyingHorn

और आप पेड़ के "जड़" पर Person साथ खत्म हो जाएगा। यह लाइव है क्योंकि इसका संदर्भ स्थानीय चर, p द्वारा किया जाता है, जिसे प्रोग्राम किसी भी समय Person ऑब्जेक्ट को संदर्भित करने के लिए उपयोग कर सकता है। यह अन्य वस्तुओं के लिए भी जाता है, p.car , p.car.engine , आदि के माध्यम से।

चूंकि Person और अन्य सभी वस्तुएं इसके साथ जुड़े हुए हैं, जीसी ने उन्हें एकत्रित किया है, तो परेशानी होगी।

हालांकि, यदि कुछ समय बाद निम्नलिखित चल रहा है, तो विचार करें:

p.car = new Car(BLUE);

और ग्राफ को दोबारा दोहराएं:

     Person [p]
        |
     Car (blue)       Car (red)
                    /           \
                Engine    AnnoyingHorn

अब p p.car माध्यम से p और नीली कार के माध्यम से Person सुलभ है, लेकिन लाल कार या उसके हिस्सों को फिर कभी एक्सेस नहीं किया जा सकता है - वे एक जीवित रूट से जुड़े नहीं हैं। उन्हें सुरक्षित रूप से एकत्र किया जा सकता है।

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


आईबीएम वेब साइट निम्नलिखित जीसी जड़ों के रूप में सूचीबद्ध है।

ध्यान दें कि इनमें से कुछ मेमोरी विश्लेषक द्वारा कृत्रिम संरचनाएं हैं, लेकिन अभी भी यह जानना महत्वपूर्ण है कि आप एक ढेर डंप को देख रहे हैं या नहीं।

  • सिस्टम क्लास

    एक वर्ग जिसे बूटस्ट्रैप लोडर द्वारा लोड किया गया था, या सिस्टम क्लास लोडर। उदाहरण के लिए, इस श्रेणी में rt.jar फ़ाइल (जावा रनटाइम पर्यावरण का हिस्सा) में सभी वर्ग शामिल हैं, जैसे java.util। * पैकेज में।

  • जेएनआई स्थानीय

    देशी कोड में एक स्थानीय चर, उदाहरण के लिए उपयोगकर्ता द्वारा परिभाषित जेएनआई कोड या जेवीएम आंतरिक कोड।

  • जेएनआई ग्लोबल

    देशी कोड में एक वैश्विक चर, उदाहरण के लिए उपयोगकर्ता द्वारा परिभाषित जेएनआई कोड या जेवीएम आंतरिक कोड।

  • थ्रेड ब्लॉक

    एक ऑब्जेक्ट जिसे सक्रिय थ्रेड ब्लॉक से संदर्भित किया गया था।

  • धागा

    एक चल रहा धागा

  • व्यस्त मॉनीटर

    सबकुछ जिसे प्रतीक्षा () या सूचित () विधियों कहा जाता है, या जो सिंक्रनाइज़ किया जाता है, उदाहरण के लिए सिंक्रनाइज़ (ऑब्जेक्ट) विधि या सिंक्रनाइज़ विधि को दर्ज करके। यदि विधि स्थैतिक थी, तो रूट एक वर्ग है, अन्यथा यह एक वस्तु है।

  • जावा स्थानीय

    एक स्थानीय चर। उदाहरण के लिए, इनपुट पैरामीटर, या स्थानीय रूप से बनाए गए ऑब्जेक्ट्स जो कि थ्रेड के ढेर में हैं। मूल ढेर

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

  • finalizer

    एक वस्तु जो एक कतार में है, एक फाइनल चलाने के लिए इंतजार कर रहा है।

  • Unfinalized

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

  • नहीं पहुंचा जा सकता

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

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

    डिफ़ॉल्ट रूप से, पहुंचने योग्य ऑब्जेक्ट्स को तब बाहर रखा जाता है जब मेमोरी विश्लेषक ढेर डंप को पार करता है। इसलिए इन वस्तुओं को हिस्टोग्राम, डोमिनेटर पेड़, या क्वेरी परिणामों में नहीं दिखाया जाता है। आप फ़ाइल> प्राथमिकताएं ...> जावा के लिए आईबीएम डायग्नोस्टिक टूल्स - मेमोरी विश्लेषक पर क्लिक करके इस व्यवहार को बदल सकते हैं, फिर पहुंचने योग्य ऑब्जेक्ट्स को चेक बॉक्स का चयन कर सकते हैं।

  • जावा स्टैक फ्रेम

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

  • अनजान

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





gc-roots