हाय! मला वाटते की तुमच्या संगणकावर मर्यादित मेमरी आहे असे मी तुम्हाला सांगितले तर तुम्हाला फारसे आश्चर्य वाटणार नाही :)
तुमची हार्ड ड्राईव्ह देखील (जे RAM च्या अनेक वेळा आहे) तुमचे आवडते गेम, टीव्ही शो आणि इतर गोष्टींनी भरलेले असू शकते. हे होण्यापासून रोखण्यासाठी, तुम्हाला तुमच्या संगणकाच्या मेमरीच्या सद्य स्थितीचे निरीक्षण करणे आणि अनावश्यक फाइल्स हटवणे आवश्यक आहे. हे सर्व Java प्रोग्रामिंगशी कसे संबंधित आहे? अगदी थेट! शेवटी, कोणतीही वस्तू तयार केल्याने Java मशीन त्याच्यासाठी मेमरी वाटप करते . एक मोठा वास्तविक-जागतिक कार्यक्रम दहापट किंवा शेकडो हजारो वस्तू तयार करतो आणि त्या प्रत्येकासाठी मेमरीचा एक भाग वाटप केला जातो. पण तुम्हाला काय वाटतं, यापैकी किती वस्तू अस्तित्वात आहेत? आमचा कार्यक्रम चालू असताना ते "जिवंत" आहेत का? नक्कीच नाही. त्यांच्या सर्व फायद्यांसह, Java ऑब्जेक्ट्स अमर नाहीत :) ऑब्जेक्ट्सचे स्वतःचे जीवनचक्र असते. आज आम्ही कोड लिहिण्यापासून थोडा ब्रेक घेऊ आणि ही प्रक्रिया एक्सप्लोर करू :) प्रोग्राम कसा कार्य करतो हे समजून घेण्यासाठी आणि संसाधने व्यवस्थापित करण्यासाठी देखील हे खूप महत्वाचे आहे. तर, एखाद्या वस्तूचे जीवन कोठे सुरू होते? मनुष्यासारखा, जन्मापासून, म्हणजे जेव्हा तो निर्माण होतो.
कचरा संकलक ही एक अंतर्गत जावा यंत्रणा आहे जी मेमरी मुक्त करण्यासाठी जबाबदार आहे, म्हणजे मेमरीमधून अनावश्यक वस्तू काढून टाकणे. आम्ही रोबोट व्हॅक्यूम क्लिनरसह त्याचे प्रतिनिधित्व करण्याचे निवडण्याचे एक कारण आहे. कचरा संकलक जवळजवळ त्याच प्रकारे कार्य करतो: तो कचरा गोळा करून, पार्श्वभूमीत आपला प्रोग्राम "फिरतो". आपल्याला व्यावहारिकरित्या त्याच्याशी संवाद साधण्याची गरज नाही. प्रोग्राममध्ये वापरल्या जाणार्या वस्तू हटविणे हे त्याचे कार्य आहे. अशा प्रकारे, ते इतर वस्तूंसाठी मेमरी मुक्त करते. तुम्हाला आठवत आहे का की धड्याच्या सुरुवातीला आम्ही वास्तविक जीवनात सांगितले होते की तुम्हाला तुमच्या संगणकाच्या स्थितीचे निरीक्षण करावे लागेल आणि जुन्या फायली हटवाव्या लागतील? आम्ही जावा ऑब्जेक्ट्सबद्दल बोलत असल्यास, कचरा गोळा करणारा तुमच्यासाठी हे करतो. तुमचा प्रोग्राम चालू असताना कचरा गोळा करणारा अनेक वेळा सुरू केला जातो: तुम्हाला त्याला स्पष्टपणे कॉल करण्याची आणि कमांड देण्याची गरज नाही (जरी हे तांत्रिकदृष्ट्या शक्य आहे). आम्ही नंतर कचरा गोळा करणाऱ्यांबद्दल अधिक बोलू आणि ते कसे कार्य करते याचे अधिक तपशीलवार विश्लेषण करू. जेव्हा कचरा गोळा करणारी वस्तू एखाद्या वस्तूपर्यंत पोहोचते - ती नष्ट होण्यापूर्वी - वस्तूची विशेष
व्हॅक्यूम क्लिनर योग्यरित्या चालण्यासाठी, आपल्याला मजला सभ्य आकारात ठेवण्याची आणि ते हाताळू शकत नाही अशा सर्व गोष्टी उचलण्याची आवश्यकता आहे. कचरा गोळा करणारे हेच तत्व पाळतात. जर एखाद्या प्रोग्राममध्ये पुष्कळ वस्तू असतील ज्या ते साफ करू शकत नाहीत (जसे की आमच्या रोबोटिक व्हॅक्यूम क्लिनरसाठी सॉक किंवा लेगो), एक दिवस आमची मेमरी संपेल. तुमचा प्रोग्राम केवळ हँग होणार नाही, तर इतर सर्व प्रोग्राम्स जे संगणकावर चालत असतील ते देखील हँग होतील. शेवटी, त्यांच्याकडे एकतर पुरेशी मेमरी नसेल (आमच्या सादृश्याकडे परत येताना, मजल्यावरील तुटलेली काच केवळ व्हॅक्यूम क्लिनरच नाही तर घरात राहणारे लोक देखील थांबतात). थोडक्यात, जावामध्ये ऑब्जेक्ट लाइफसायकल आणि कचरा संकलन असे दिसते. आपल्याला हे लक्षात ठेवण्याची आवश्यकता नाही: ते कसे कार्य करते हे समजून घेणे पुरेसे आहे. पुढील धड्यात, आम्ही ' या प्रक्रियेकडे अधिक तपशीलवार परत येऊ. पण आतासाठी, तुम्ही CodeGym टास्क सोडवण्यासाठी परत येऊ शकता :) शुभेच्छा!
Cat cat = new Cat();// Our Cat object's lifecycle begins now!
प्रथम, जावा व्हर्च्युअल मशीन ऑब्जेक्ट तयार करण्यासाठी आवश्यक मेमरी वाटप करते. cat
मग ते त्याचा मागोवा ठेवणे शक्य करण्यासाठी (आमच्या बाबतीत, ) संदर्भ तयार करते . मग सर्व व्हेरिएबल्स इनिशियलाइज केल्या जातात, कन्स्ट्रक्टरला कॉल केला जातो आणि आपला ताजा ऑब्जेक्ट आता स्वतःचे जीवन जगत आहे :) ऑब्जेक्टचे आयुष्य बदलते. येथे कोणतेही अचूक आकडे नाहीत. कोणत्याही घटनेत, एखादी वस्तू प्रोग्राममध्ये राहते आणि काही कालावधीसाठी त्याचे कार्य करते. तंतोतंत सांगायचे तर, जोपर्यंत त्याचे संदर्भ आहेत तोपर्यंत ती वस्तू "जिवंत" असते. कोणतेही संदर्भ नसल्यामुळे, वस्तू "मृत्यू" होते. उदाहरणार्थ:
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public static void main(String[] args) {
Car lamborghini = new Car("Lamborghini Diablo");
lamborghini = null;
}
}
पद्धतीमध्ये main()
, "लॅम्बोर्गिनी डायब्लो" कार ऑब्जेक्ट दुसऱ्या ओळीवर जिवंत राहणे थांबवते. त्यात फक्त एकच संदर्भ होता आणि तो संदर्भ रद्द करण्यात आला होता. डायब्लोचे कोणतेही संदर्भ शिल्लक नसल्यामुळे ते "कचरा" बनते. हे होण्यासाठी संदर्भ शून्यावर सेट करणे आवश्यक नाही:
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public static void main(String[] args) {
Car lamborghini = new Car("Lamborghini Diablo");
Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
lamborghini = lamborghiniGallardo;
}
}
येथे आम्ही दुसरा ऑब्जेक्ट तयार केला आहे आणि तो लॅम्बोर्गिनी संदर्भासाठी नियुक्त केला आहे. आता दोन संदर्भ ऑब्जेक्टकडे निर्देश करतात Lamborghini Gallardo
, परंतु Lamborghini Diablo
ऑब्जेक्टला काहीही नाही. याचा अर्थ Diablo
वस्तू कचरा बनते. जेव्हा Java चे अंगभूत कचरा संग्राहक (GC) किक इन करते.
finalize()
पद्धत म्हणतात. ऑब्जेक्टद्वारे वापरलेली काही अतिरिक्त संसाधने सोडण्यासाठी या पद्धतीचा वापर केला जाऊ शकतो. पद्धत finalize()
ऑब्जेक्ट क्लासशी संबंधित आहे. equals()
दुसऱ्या शब्दांत, ते , hashCode()
आणि toString()
(जे तुम्ही पूर्वी भेटले आहे) सारखे आहे . प्रत्येक वस्तूकडे ते असते . हे इतर पद्धतींपेक्षा वेगळे आहे... हे कसे म्हणायचे... हे खूप जाणूनबुजून आहे. त्याद्वारे आपल्याला असे म्हणायचे आहेएखादी वस्तू नष्ट होण्यापूर्वी ती नेहमी कॉल केली जात नाही . प्रोग्रामिंग एक अतिशय अचूक क्रियाकलाप आहे. प्रोग्रामर संगणकाला काहीतरी करायला सांगतो आणि संगणक ते करतो. मी असे गृहीत धरतो की तुम्हाला या प्रकारच्या वर्तनाची सवय झाली आहे, म्हणून प्रथम तुम्हाला खालील कल्पना स्वीकारणे कठीण होऊ शकते: "एखादी वस्तू नष्ट होण्यापूर्वी, ऑब्जेक्ट क्लासची पद्धत कॉल केली जाते. किंवा नाही. finalize()
जर आम्ही भाग्यवान झालो तर! " तरीही, हे वास्तव आहे. जावा मशीन स्वतःच ठरवते की केस आधारावर finalize() कॉल करायचा की नाही. प्रयोग म्हणून, खालील कोड चालवण्याचा प्रयत्न करूया:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public Cat() {
}
public static void main(String[] args) throws Throwable {
for (int i = 0 ; i < 1000000; i++) {
Cat cat = new Cat();
cat = null;// The first object becomes available for garbage collection here
}
}
@Override
protected void finalize() throws Throwable {
System.out.println("The Cat is destroyed!");
}
}
आम्ही एक Cat
वस्तू तयार करतो आणि पुढच्या ओळीत आम्ही फक्त त्याचा संदर्भ शून्य करतो. आणि आम्ही ते लाखो वेळा करतो. आम्ही finalize()
पद्धत स्पष्टपणे ओव्हरराइड केली आहे. प्रत्येक वेळी जेव्हा एखादी Cat
वस्तू नष्ट केली जाते तेव्हा ती एक स्ट्रिंग प्रदर्शित करणे आवश्यक आहे - एकूण एक दशलक्ष वेळा. पण नाही! अचूक सांगायचे तर, माझ्या संगणकावर ते फक्त 37346 वेळा कार्यान्वित केले गेले! दुसऱ्या शब्दांत, माझ्या Java मशीनने finalize()
प्रत्येक 27 पैकी फक्त 1 प्रकरणांमध्ये पद्धत कॉल करण्याचा निर्णय घेतला. इतर प्रकरणांमध्ये, कचरा संकलनात या कॉलचा समावेश नव्हता. हा कोड स्वतः चालवून पहा. तुम्हाला बहुधा वेगळा निकाल मिळेल. तुम्ही बघू शकता, finalize()
विश्वासार्ह भागीदाराला कॉल करणे कठीण आहे :) म्हणून, भविष्यासाठी येथे एक छोटी टीप आहे: finalize()
गंभीर संसाधने सोडण्याच्या पद्धतीवर अवलंबून राहू नका.JVM त्याला कॉल करू शकते, किंवा ते कदाचित नाही. कुणास ठाऊक? तुमचा ऑब्जेक्ट जिवंत असताना काही कार्यप्रदर्शन-गंभीर संसाधने (उदाहरणार्थ, ओपन डेटाबेस कनेक्शन) असल्यास, ऑब्जेक्टची यापुढे आवश्यकता नसताना त्यांना सोडण्यासाठी एक विशेष पद्धत तयार करणे आणि स्पष्टपणे कॉल करणे चांगले होईल. अशा प्रकारे, तुमच्या प्रोग्रामच्या कार्यप्रदर्शनास त्रास होणार नाही हे तुम्हाला निश्चितपणे कळेल. आम्ही असे सांगून सुरुवात केली की मेमरी आणि कचरा गोळा करणे हे खूप महत्वाचे विषय आहेत आणि ते खरेच आहेत. संसाधनांची चुकीची हाताळणी करणे आणि अनावश्यक वस्तू कशा स्वच्छ केल्या जातात याचा गैरसमज केल्याने सर्वात अप्रिय बग्सपैकी एक होऊ शकतो: मेमरी लीक . ही सर्वात प्रसिद्ध प्रोग्रामिंग त्रुटींपैकी एक आहे. त्याचा स्वतःचा विकिपीडिया लेख देखील आहे. खराब लिखित कोड अशी परिस्थिती निर्माण करू शकतो जिथे प्रत्येक वेळी नवीन तयार केलेल्या वस्तूंसाठी मेमरी वाटप केली जाते, परंतु जुन्या, अनावश्यक वस्तू कचरा संकलनासाठी अनुपलब्ध असतात. आम्ही आधीच रोबोट व्हॅक्यूम क्लिनर सादृश्य बनवलेले असल्यामुळे, रोबोट चालवण्यापूर्वी तुम्ही घरभर मोजे विखुरले, काचेची फुलदाणी फोडली आणि लेगोचे तुकडे जमिनीवर टाकले तर काय होईल याची कल्पना करा. स्वाभाविकच, रोबोट काहीतरी करण्याचा प्रयत्न करेल, परंतु एक दिवस तो पकडेल.
GO TO FULL VERSION