CodeGym /Java Blog /अनियमित /कचरा कलेक्टर के बारे में अधिक
John Squirrels
स्तर 41
San Francisco

कचरा कलेक्टर के बारे में अधिक

अनियमित ग्रुप में प्रकाशित
नमस्ते! पिछले पाठ में, हम पहली बार जावा के अंतर्निहित कचरा संग्राहक से परिचित हुए और यह कैसे काम करता है इसका एक मोटा विचार प्राप्त किया। यह पृष्ठभूमि में काम करता है जब आपका प्रोग्राम चल रहा होता है, अनावश्यक वस्तुओं को एकत्रित करता है जिसे बाद में हटा दिया जाएगा। इस प्रकार, यह स्मृति को मुक्त करता है जिसका उपयोग भविष्य में नई वस्तुओं को बनाने के लिए किया जा सकता है।
कूड़ा बीनने वाले के बारे में अधिक जानकारी - 1
इस पाठ में, हम और अधिक विस्तार से चर्चा करेंगे कि यह कैसे काम करता है। उदाहरण के लिए, कोई वस्तु कैसे और कब अनावश्यक हो जाती है? और कचरा संग्रहकर्ता को कैसे पता चलता है? ये ऐसे प्रश्न हैं जिनका उत्तर हम आज के पाठ के दौरान देंगे :) पाठ एक सिंहावलोकन की तरह होगा: आपको इस सामग्री को कंठस्थ करने की आवश्यकता नहीं है। इरादा मुख्य रूप से स्मृति और कचरा संग्रहकर्ता कैसे काम करता है, इस बारे में आपकी दृष्टि का विस्तार करना है, इसलिए बस इसे पढ़ें और अपने लिए कुछ नया खोजें :) चलिए! याद रखने वाली पहली बात यह है कि कचरा संग्राहक आपके कार्यक्रम के समानांतर काम करता है. यह आपके कार्यक्रम का हिस्सा नहीं है। यह अलग से चलता है (पिछले पाठ में, हमने इसकी तुलना रोबोट वैक्यूम क्लीनर से की थी) लेकिन ऐसा हमेशा नहीं था। कचरा संग्रह आपके प्रोग्राम के समान थ्रेड पर किया जाता था। कुछ शेड्यूल पर (हर कुछ मिनट में एक बार), कचरा संग्रहकर्ता कार्यक्रम में अवांछित वस्तुओं की उपस्थिति की जांच करेगा। समस्या यह थी कि इस जाँच और कचरा संग्रह के दौरान कार्यक्रम लटका (निष्पादित नहीं) होगा। कल्पना कीजिए कि आप काम पर अपने कार्यालय में बैठे हैं। लेकिन तभी सफाई करने वाली महिला फर्श धोने के लिए आ जाती है। वह आपको 5 मिनट के लिए आपके कंप्यूटर से दूर कर देती है और आप तब तक प्रतीक्षा करते हैं जब तक वह सफाई पूरी नहीं कर लेती। इस समय के दौरान, आप काम करने में असमर्थ हैं। इस बारे में कचरा संग्रह कैसे काम करता था :) इस तंत्र को बाद में बदल दिया गया था, और अब कचरा संग्रहकर्ता पृष्ठभूमि में चलता है, कार्यक्रम के काम में ही बाधा नहीं। आप पहले से ही जानते हैं कि कोई वस्तु तब मर जाती है जब उसके पास संदर्भ नहीं होते हैं। यथार्थ में,कचरा संग्राहक वस्तु संदर्भों की गणना नहीं करता है । सबसे पहले, इसमें लंबा समय लग सकता है। दूसरा, यह बहुत प्रभावी नहीं है। आखिरकार, वस्तुएं एक दूसरे को संदर्भित कर सकती हैं! कूड़ा बीनने वाले के बारे में अधिक जानकारी - 2यह आंकड़ा एक उदाहरण दिखाता है जहां 3 ऑब्जेक्ट एक दूसरे को संदर्भित करते हैं, लेकिन कोई भी उन्हें संदर्भित नहीं करता है। दूसरे शब्दों में, शेष प्रोग्राम को उनकी आवश्यकता नहीं है। यदि कचरा संग्रहकर्ता केवल संदर्भों की गणना करता है, तो इन 3 वस्तुओं को एकत्र नहीं किया जाएगा और स्मृति को मुक्त नहीं किया जाएगा (उनके संदर्भ हैं!) हम इसकी तुलना एक अंतरिक्ष यान से कर सकते हैं। उड़ान के दौरान, अंतरिक्ष यात्री मरम्मत के लिए उपलब्ध पुर्जों की सूची की जांच करने का निर्णय लेते हैं। अन्य बातों के अलावा, वे एक साधारण कार से स्टीयरिंग व्हील और पैडल पाते हैं। जाहिर है, यहां उनकी जरूरत नहीं है और अनावश्यक रूप से जगह ले रहे हैं (हालांकि ये दो भाग एक दूसरे से संबंधित हैं और कुछ कार्य हैं)। लेकिन अंतरिक्ष यान के अंदर वे बेकार कचरा हैं जिन्हें फेंक दिया जाना चाहिए। तदनुसार, जावा में, संदर्भ गणना के आधार पर कचरा एकत्र करने का निर्णय लिया गया था,पहुंच योग्य और अप्राप्य । हम कैसे निर्धारित करते हैं कि कोई वस्तु पहुंच योग्य है या नहीं? यह सब सरल है। एक वस्तु पहुँच योग्य है यदि इसे किसी अन्य पहुँच योग्य वस्तु द्वारा संदर्भित किया जाता है। इस प्रकार, हमें "पहुँच की श्रृंखला" मिलती है। यह तब शुरू होता है जब कार्यक्रम शुरू होता है और कार्यक्रम की अवधि के लिए जारी रहता है। यह कुछ इस तरह दिखता है: कूड़ा बीनने वाले के बारे में अधिक जानकारी - 3 चित्र में तीर हमारे प्रोग्राम के निष्पादन योग्य कोड को इंगित करता है। कोड (उदाहरण के लिए, main()विधि) वस्तुओं के संदर्भ बनाता है। ये वस्तुएं अन्य वस्तुओं को संदर्भित कर सकती हैं, वे वस्तुएं अभी भी अन्य वस्तुओं को, और इसी तरह। यह एक संदर्भ श्रृंखला बनाता है. यदि आप किसी ऑब्जेक्ट से "रूट रेफरेंस" (सीधे निष्पादन योग्य कोड में बनाया गया) तक चेन के साथ ट्रेस कर सकते हैं, तो इसे रीचेबल माना जाता है। ऐसी वस्तुओं को चित्र में काले रंग से चिह्नित किया गया है। लेकिन एक वस्तु पहुंच से बाहर है यदि वस्तु इस श्रृंखला से बाहर हो जाती है, यानी वर्तमान में निष्पादित किए जा रहे कोड में कोई भी चर इसे संदर्भित नहीं करता है, और इसे "संदर्भ श्रृंखला" के माध्यम से नहीं पहुँचा जा सकता है। हमारे कार्यक्रम में, ऐसी दो वस्तुओं को लाल रंग से चिह्नित किया गया है। ध्यान दें कि इन "लाल" वस्तुओं में एक दूसरे के संदर्भ हैं। लेकिन जैसा कि हमने पहले कहा, जावा का आधुनिक कचरा संग्राहक संदर्भों की गिनती नहीं करता है। यह निर्धारित करता है कि कोई वस्तु पहुँच योग्य है या पहुँच योग्य नहीं है. नतीजतन, यह आकृति में दो लाल वस्तुओं पर कब्जा कर लेगा। अब आइए पूरी प्रक्रिया को शुरू से अंत तक देखें। ऐसा करने में, हम यह भी देखेंगे कि जावा में मेमोरी को कैसे व्यवस्थित किया जाता है :) सभी जावा ऑब्जेक्ट्स को मेमोरी के एक विशेष क्षेत्र में संग्रहित किया जाता है जिसे हीप कहा जाता है । रोजमर्रा की भाषा में, ढेर आमतौर पर वस्तुओं का पहाड़ होता है, जहां सब कुछ मिश्रित होता है। लेकिन जावा में ढेर ऐसा नहीं है। इसकी संरचना बहुत तार्किक और उचित है। किसी बिंदु पर, जावा प्रोग्रामर ने पाया कि उनकी सभी वस्तुओं को दो प्रकारों में विभाजित किया जा सकता है: साधारण वस्तुएं और "दीर्घकालिक वस्तुएं". "दीर्घजीवी वस्तुएँ" वे वस्तुएँ हैं जो कचरा संग्रह के कई दौरों से बची हैं। वे आमतौर पर कार्यक्रम समाप्त होने तक रहते हैं। अंत में, पूरा ढेर, जहाँ सभी वस्तुओं को संग्रहीत किया जाता है, को कई भागों में विभाजित किया गया। पहले भाग का एक सुंदर नाम है: ईडन(बाइबिल "गार्डन ऑफ ईडन" से)। यह नाम उपयुक्त है, क्योंकि यह वह जगह है जहाँ वस्तुएँ बनने के बाद समाप्त हो जाती हैं। यह स्मृति का वह हिस्सा है जहां नए कीवर्ड का उपयोग करने पर नई वस्तुओं का निर्माण होता है। बहुत सारी वस्तुएं बनाई जा सकती हैं। जब यह क्षेत्र अंतरिक्ष से बाहर हो जाता है, तो प्रारंभिक "तेज" कचरा संग्रह शुरू होता है। हमें कहना होगा कि कचरा बीनने वाला बहुत चालाक होता है। यह इस आधार पर एक एल्गोरिदम चुनता है कि ढेर में अधिक कचरा है या अधिक जीवित वस्तुएं हैं। यदि लगभग सभी वस्तुएं कचरा हैं, तो संग्राहक जीवित वस्तुओं को चिह्नित करता है और उन्हें स्मृति के दूसरे क्षेत्र में ले जाता है। तब वर्तमान क्षेत्र पूरी तरह से साफ हो जाता है। यदि बहुत अधिक कचरा नहीं है, और ढेर ज्यादातर जीवित वस्तुएं हैं, तो कलेक्टर कचरे को चिह्नित करता है, इसे साफ करता है और अन्य वस्तुओं को एक साथ पैक करता है। हम कहा "एक जीवित स्थानएक उत्तरजीविता स्थान , बदले में, पीढ़ियों में विभाजित होता है । प्रत्येक वस्तु एक विशेष पीढ़ी से संबंधित होती है, यह इस बात पर निर्भर करता है कि यह कचरा संग्रहण के कितने दौर तक जीवित रही है। यदि कोई वस्तु कचरा संग्रह के एक दौर से बच गई है, तो यह "जनरेशन 1" में है; यदि 5, तो "पीढ़ी 5"। साथ में, ईडन और एक उत्तरजीविता स्थान एक ऐसा क्षेत्र बनाते हैं जिसे युवा पीढ़ी कहा जाता है । युवा पीढ़ी के अलावा, ढेर में स्मृति का एक और क्षेत्र है जिसे पुरानी पीढ़ी कहा जाता है. यह ठीक वह क्षेत्र है जहां लंबे समय तक जीवित रहने वाली वस्तुएं कचरा संग्रह के कई दौरों से बची रहती हैं। उन्हें अन्य सभी से अलग रखने के फायदे हैं। पूर्ण कचरा संग्रह तभी किया जाता है जब पुरानी पीढ़ी भर जाती है, अर्थात कार्यक्रम में इतने लंबे समय तक रहने वाली वस्तुएं होती हैं कि पर्याप्त मेमोरी नहीं होती है। इस प्रक्रिया में स्मृति के एक से अधिक क्षेत्र शामिल होते हैं। सामान्य तौर पर, इसमें जावा मशीन द्वारा बनाई गई सभी वस्तुएँ शामिल होती हैं। स्वाभाविक रूप से, इसमें अधिक समय और संसाधन लगते हैं। यह लंबे समय तक रहने वाली वस्तुओं को अलग से स्टोर करने का निर्णय था। "त्वरित कचरा संग्रह" तब किया जाता है जब अन्य क्षेत्रों में जगह कम हो जाती है। इसमें केवल एक क्षेत्र शामिल है, जो इसे तेज और अधिक कुशल बनाता है। अंत में, जब लंबे समय तक रहने वाली वस्तुओं के लिए भी क्षेत्र पूरी तरह भर जाता है, पूर्ण कचरा संग्रह शुरू हो गया है। इस प्रकार, संग्राहक "सबसे भारी" उपकरण का उपयोग केवल तभी करता है जब इससे बचना असंभव हो। यहाँ ढेर संरचना और कचरा संग्रह का एक दृश्य प्रतिनिधित्व है: कूड़ा बीनने वाले के बारे में अधिक जानकारी - 4
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION