वस्तुओं की पीढ़ियों के साथ काम करना
जावा कचरा संग्राहक एक पीढ़ीगत कचरा संग्रह रणनीति लागू करते हैं जो वस्तुओं को उम्र के अनुसार वर्गीकृत कर सकते हैं।
जेवीएम में इस तरह की आवश्यकता (सभी वस्तुओं को चिह्नित करने और कॉम्पैक्ट करने के लिए) को अक्षम कहा जा सकता है। चूंकि बड़ी संख्या में वस्तुओं को आवंटित किया जाता है, इसलिए उनकी सूची बढ़ती है, जिससे कचरा संग्रहण समय में वृद्धि होती है। अनुप्रयोगों के अनुभवजन्य विश्लेषण से पता चला है कि जावा में अधिकांश वस्तुएं अल्पकालिक हैं।
जेवीएम में हीप मेमोरी क्षेत्र को तीन वर्गों में विभाजित किया गया है:
![वस्तुओं की पीढ़ियों के साथ काम करना](https://cdn.codegym.cc/images/article/8aab6bd2-292b-4ecd-9ecc-9ee2a44d3c82/1024.jpeg)
युवा पीढ़ी
नई बनाई गई वस्तुएं युवा पीढ़ी में शुरू होती हैं। युवा पीढ़ी को आगे दो श्रेणियों में विभाजित किया गया है।
- ईडन स्पेस - सभी नई वस्तुएं यहां शुरू होती हैं, उन्हें प्रारंभिक मेमोरी आवंटित की जाती है।
सर्वाइवर स्पेसेस (फ्रॉमस्पेस और टूस्पेस) - वस्तुओं को एक कचरा संग्रहण चक्र से बचे रहने के बाद ईडन से यहां ले जाया जाता है।
प्रक्रिया जब वस्तुओं को युवा पीढ़ी से कचरा एकत्र किया जाता है, तो इसे मामूली कचरा संग्रह घटना कहा जाता है।
जब ईडन का स्थान वस्तुओं से भर जाता है, तो एक छोटा कचरा संग्रह किया जाता है। सभी मृत वस्तुओं को हटा दिया जाता है, और सभी जीवित वस्तुओं को शेष दो स्थानों में से एक में ले जाया जाता है। छोटा GC सर्वाइवर स्पेस में ऑब्जेक्ट्स की भी जाँच करता है और उन्हें दूसरे (अगले) सर्वाइवर स्पेस में ले जाता है।
आइए निम्नलिखित अनुक्रम को एक उदाहरण के रूप में लें।
- ईडन में दोनों प्रकार की वस्तुएं (जीवित और मृत) हैं।
- एक छोटा जीसी होता है - ईडन से सभी मृत वस्तुओं को हटा दिया जाता है। सभी सजीव वस्तुओं को अंतरिक्ष-1 (अंतरिक्ष से) में ले जाया जाता है। ईडन और स्पेस-2 अब खाली हैं।
- ईडन में नई वस्तुएं बनाई और जोड़ी जाती हैं। ईडन और स्पेस-1 में कुछ वस्तुएं मृत हो जाती हैं।
- एक छोटा जीसी होता है - ईडन और स्पेस -1 से सभी मृत वस्तुओं को हटा दिया जाता है। सभी सजीव वस्तुओं को स्पेस-2 (ToSpace) में ले जाया जाता है। ईडन और स्पेस-1 खाली हैं।
इस प्रकार, किसी भी समय, बचे हुए स्थानों में से एक हमेशा खाली रहता है। जब उत्तरजीवी उत्तरजीवी स्थानों के माध्यम से आगे बढ़ने के लिए एक निश्चित सीमा तक पहुँचते हैं, तो वे एक पुरानी पीढ़ी के लिए आगे बढ़ते हैं।
युवा पीढ़ी के आकार को सेट करने के लिए आप -Xmn फ़्लैग का उपयोग कर सकते हैं ।
पुरानी पीढ़ी
वस्तुएँ जो महत्वपूर्ण समय तक जीवित रहती हैं (उदाहरण के लिए, किसी कार्यक्रम के जीवनकाल का अधिकांश समय) अंततः पुरानी वस्तुएँ बन जाती हैं - शताब्दी। इसे नियमित पीढ़ी के रूप में भी जाना जाता है और इसमें ऐसी वस्तुएँ होती हैं जिन्हें लंबे समय तक सर्वाइवर स्पेस में छोड़ दिया जाता है।
एक वस्तु का जीवनकाल सीमा निर्धारित करती है कि इसे पुरानी पीढ़ी में ले जाने से पहले कितने कचरा संग्रहण चक्रों से गुजरना होगा। प्रक्रिया जब पुरानी पीढ़ी से वस्तुओं को कचरे में भेजा जाता है, तो इसे मुख्य कचरा संग्रह घटना कहा जाता है।
प्रारंभिक और अधिकतम हीप मेमोरी आकार सेट करने के लिए आप -Xms और -Xmx फ़्लैग का उपयोग कर सकते हैं ।
क्योंकि जावा पीढ़ीगत कचरा संग्रह का उपयोग करता है, जितना अधिक कचरा संग्रह एक वस्तु का अनुभव करता है, उतना ही यह ढेर पर आगे बढ़ता है। वह युवा पीढ़ी में शुरू होता है और अंत में नियमित पीढ़ी में समाप्त होता है यदि वह लंबे समय तक जीवित रहता है।
रिक्त स्थान और पीढ़ियों के बीच वस्तुओं के प्रचार को समझने के लिए, निम्नलिखित उदाहरण पर विचार करें:
जब कोई वस्तु बनाई जाती है, तो उसे सबसे पहले युवा पीढ़ी के ईडन स्थान में रखा जाता है।
जैसे ही एक छोटा कचरा संग्रह होता है, ईडन से जीवित वस्तुओं को फ्रॉमस्पेस में ले जाया जाता है। जब अगला छोटा कचरा संग्रह होता है, ईडन और अंतरिक्ष दोनों से जीवित वस्तुओं को टूस्पेस में ले जाया जाता है।
यह चक्र एक निश्चित संख्या में जारी रहता है। यदि वस्तु इस बिंदु के बाद भी "सेवा में" है, तो अगला कचरा संग्रह चक्र इसे पुरानी पीढ़ी के स्थान पर ले जाएगा।
स्थायी पीढ़ी और मेटास्पेस
कक्षाओं और विधियों जैसे मेटाडेटा को लगातार पीढ़ी में संग्रहित किया जाता है। जेवीएम इसे एप्लिकेशन द्वारा उपयोग की जाने वाली कक्षाओं के आधार पर रनटाइम पर पॉप्युलेट करता है। जिन वर्गों का अब उपयोग नहीं किया जाता है वे स्थायी पीढ़ी से कचरे में जा सकते हैं।
आप स्थायी पीढ़ी के प्रारंभिक और अधिकतम आकार को सेट करने के लिए -XX:PermGen और -XX:MaxPermGen फ़्लैग का उपयोग कर सकते हैं ।
मेटा स्पेस
Java 8 के बाद से PermGen स्पेस को MetaSpace मेमोरी स्पेस से बदल दिया गया है। कार्यान्वयन PermGen से भिन्न है - यह हीप स्थान अब स्वचालित रूप से बदल गया है।
यह एप्लिकेशन की मेमोरी से बाहर होने की समस्या से बचाता है जो PermGen के हीप स्पेस के सीमित आकार के कारण होती है। मेटास्पेस मेमोरी को कचरा एकत्र किया जा सकता है, और जो वर्ग अब उपयोग में नहीं हैं, वे स्वचालित रूप से साफ हो जाएंगे जब मेटास्पेस अपने अधिकतम आकार तक पहुंच जाएगा।