CodeGym /Java Blog /यादृच्छिक /कचरा गोळा करणाऱ्या बद्दल अधिक
John Squirrels
पातळी 41
San Francisco

कचरा गोळा करणाऱ्या बद्दल अधिक

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