वस्तूंच्या पिढ्यांसह कार्य करणे

जावा कचरा गोळा करणारे पिढीतील कचरा संकलन धोरण राबवतात जे वयानुसार वस्तूंचे वर्गीकरण करू शकतात.

JVM मध्ये अशी गरज (सर्व वस्तू चिन्हांकित आणि संक्षिप्त करणे) अकार्यक्षम म्हणता येईल. मोठ्या संख्येने वस्तूंचे वाटप केल्यामुळे, त्यांची यादी वाढते, ज्यामुळे कचरा गोळा करण्याच्या वेळेत वाढ होते. ऍप्लिकेशन्सच्या प्रायोगिक विश्लेषणातून असे दिसून आले आहे की जावामधील बहुतेक वस्तू अल्पायुषी आहेत.

JVM मधील हीप मेमरी क्षेत्र तीन विभागांमध्ये विभागलेले आहे:

वस्तूंच्या पिढ्यांसह कार्य करणे

तरुण पिढी

नवनिर्मित वस्तू तरुण पिढीमध्ये सुरू होतात. तरुण पिढी पुढे दोन वर्गात विभागली गेली आहे.

  • ईडन स्पेस - सर्व नवीन वस्तू येथे सुरू होतात, त्यांना प्रारंभिक मेमरी वाटप केली जाते.
  • सर्व्हायव्हर स्पेसेस (फ्रॉमस्पेस आणि टोस्पेस) - एक कचरा संकलन चक्र टिकून राहिल्यानंतर इडनमधून वस्तू येथे हलवल्या जातात.

तरुण पिढीकडून वस्तू जेव्हा कचरा गोळा केल्या जातात त्या प्रक्रियेला किरकोळ कचरा गोळा करण्याची घटना म्हणतात.

जेव्हा ईडनची जागा वस्तूंनी भरलेली असते, तेव्हा एक छोटासा कचरा गोळा केला जातो. सर्व मृत वस्तू काढून टाकल्या जातात आणि सर्व जिवंत वस्तू उरलेल्या दोन जागांपैकी एकावर हलवल्या जातात. लहान GC देखील वाचलेल्या जागेतील वस्तू तपासते आणि त्यांना दुसऱ्या (पुढील) सर्व्हायव्हर स्पेसमध्ये हलवते.

उदाहरण म्हणून खालील क्रम घेऊ.

  1. ईडनमध्ये दोन्ही प्रकारच्या (जिवंत आणि मृत) वस्तू आहेत.
  2. एक लहान जीसी उद्भवते - सर्व मृत वस्तू एडनमधून काढल्या जातात. सर्व जिवंत वस्तू स्पेस-1 (फ्रॉमस्पेस) मध्ये हलवल्या जातात. ईडन आणि स्पेस-2 आता रिकामे आहेत.
  3. नवीन वस्तू तयार केल्या जातात आणि एडनमध्ये जोडल्या जातात. ईडन आणि स्पेस-1 मधील काही वस्तू मृत होतात.
  4. एक लहान जीसी उद्भवते - सर्व मृत वस्तू ईडन आणि स्पेस -1 मधून काढल्या जातात. सर्व जिवंत वस्तू स्पेस-2 (ToSpace) मध्ये हलवल्या जातात. ईडन आणि स्पेस-1 रिक्त आहेत.

अशा प्रकारे, कोणत्याही वेळी, वाचलेल्या जागांपैकी एक नेहमीच रिकामी असते. जेव्हा वाचलेले लोक सर्व्हायव्हर स्पेसमधून जाण्यासाठी एका विशिष्ट उंबरठ्यावर पोहोचतात तेव्हा ते जुन्या पिढीकडे जातात.

तरुण पिढीचा आकार सेट करण्यासाठी तुम्ही -Xmn ध्वज वापरू शकता .

जुनी पिढी

ज्या वस्तू बराच वेळ जगतात (उदाहरणार्थ, प्रोग्रामच्या आयुष्यातील बहुतेक) कालांतराने जुन्या वस्तू बनतात - शताब्दी. हे नियमित पिढी म्हणून देखील ओळखले जाते आणि त्यात बर्याच काळापासून सर्व्हायव्हर स्पेसमध्ये सोडलेल्या वस्तू असतात.

एखाद्या वस्तूचा आजीवन थ्रेशोल्ड जुन्या पिढीकडे हलवण्यापूर्वी त्याला किती कचरा गोळा करणे आवश्यक आहे हे निर्धारित करते. जुन्या पिढीतील वस्तू कचऱ्याकडे पाठवण्याच्या प्रक्रियेला मुख्य कचरा गोळा करण्याची घटना म्हणतात.

प्रारंभिक आणि कमाल हीप मेमरी आकार सेट करण्यासाठी तुम्ही -Xms आणि -Xmx ध्वज वापरू शकता .

जावा पिढ्यानपिढ्या कचरा संकलनाचा वापर करत असल्यामुळे, वस्तू जितक्या जास्त कचरा संकलनाचा अनुभव घेते तितकी ती ढिगाऱ्यावर पुढे सरकते. तो तरुण पिढीमध्ये सुरू होतो आणि जर तो बराच काळ जगला तर तो नियमित पिढीमध्ये संपतो.

जागा आणि पिढ्यांमधील वस्तूंचा प्रचार समजून घेण्यासाठी, खालील उदाहरणाचा विचार करा:

जेव्हा एखादी वस्तू तयार केली जाते तेव्हा ती प्रथम तरुण पिढीच्या इडन जागेत ठेवली जाते.

एक छोटासा कचरा गोळा होताच, ईडनमधील जिवंत वस्तू FromSpace मध्ये हलवल्या जातात. जेव्हा पुढील किरकोळ कचरा गोळा होतो, तेव्हा इडन आणि अवकाश या दोन्ही ठिकाणच्या जिवंत वस्तू ToSpace मध्ये हलवल्या जातात.

हे चक्र ठराविक वेळा चालू राहते. या बिंदूनंतर ऑब्जेक्ट अजूनही "सेवेत" असल्यास, पुढील कचरा संकलन चक्र ते जुन्या पिढीच्या जागेवर हलवेल.

कायमस्वरूपी पिढी आणि मेटास्पेस

वर्ग आणि पद्धतींसारखा मेटाडेटा पर्सिस्टंट जनरेशनमध्ये साठवला जातो. JVM हे ऍप्लिकेशनद्वारे वापरलेल्या वर्गांच्या आधारे रनटाइममध्ये भरते. जे वर्ग यापुढे वापरले जात नाहीत ते कायमस्वरूपी पिढीपासून कचऱ्याकडे जाऊ शकतात.

कायमस्वरूपी पिढीचा प्रारंभिक आणि कमाल आकार सेट करण्यासाठी तुम्ही -XX:PermGen आणि -XX:MaxPermGen ध्वज वापरू शकता .

मेटा स्पेस

Java 8 पासून, PermGen स्पेसची जागा MetaSpace मेमरी स्पेसने घेतली आहे. अंमलबजावणी PermGen पेक्षा वेगळी आहे - ही ढीग जागा आता आपोआप बदलली आहे.

हे PermGen च्या ढीग जागेच्या मर्यादित आकारामुळे उद्भवणारी ऍप्लिकेशनची आउट-ऑफ-मेमरी समस्या टाळते. मेटास्पेस मेमरी कचरा गोळा केली जाऊ शकते आणि मेटास्पेस त्याच्या कमाल आकारापर्यंत पोहोचल्यावर यापुढे वापरात नसलेले वर्ग आपोआप साफ केले जातील.