जावा हीप शब्दावली: युवा, पुरानी और स्थायी पीढ़ी?


318

मैं समझने की कोशिश कर रहा हूं कि जावा हीप शब्दावली में युवा , पुरानी और स्थायी पीढ़ियों की अवधारणाएं क्या हैं, और विशेष रूप से तीन पीढ़ियों के बीच की बातचीत।

मेरे प्रश्न हैं:

  • युवा पीढ़ी क्या है?
  • पुरानी पीढ़ी क्या है?
  • स्थायी पीढ़ी क्या है?
  • तीन पीढ़ियाँ आपस में कैसे जुड़ी / जुड़ी हैं?

मान लें कि आप Sun JDK / OpenJDK के बारे में बात कर रहे हैं, OpenJDK वेबसाइट पर संग्रहण प्रबंधन पर पेज देखें । तल पर और भी अधिक जानकारी के लिए कुछ लिंक हैं।
निकोलस रिले

1
इस प्रश्न के साथ "
दस

जवाबों:


304

यह एक आम गलतफहमी की तरह लगता है। ओरेकल की जेवीएम में, स्थायी पीढ़ी ढेर का हिस्सा नहीं है। यह कक्षा की परिभाषाओं और संबंधित डेटा के लिए एक अलग स्थान है। जावा 6 और इससे पहले, आंतरिक तारों को भी स्थायी पीढ़ी में संग्रहीत किया गया था। जावा 7 में, इंटर्नल स्ट्रिंग्स को मुख्य ऑब्जेक्ट हीप में संग्रहीत किया जाता है।

यहाँ स्थायी पीढ़ी पर एक अच्छी पोस्ट है ।

मुझे JConsole पर Oracle के गाइड में प्रत्येक स्थान के लिए दिए गए विवरण पसंद हैं :

हॉटस्पॉट जावा वीएम के लिए, सीरियल कचरा संग्रह के लिए मेमोरी पूल निम्नलिखित हैं।

  • ईडन स्पेस (ढेर): वह पूल जहां से मेमोरी को शुरू में ज्यादातर वस्तुओं के लिए आवंटित किया जाता है।
  • सर्वाइवर स्पेस (ढेर): वह पूल जिसमें ऑब्जेक्ट्स होते हैं जो ईडन स्पेस के कचरा संग्रह से बच गए हैं।
  • टेन्योर जेनरेशन (हीप): वह पूल जिसमें ऑब्जेक्ट्स मौजूद होते हैं जो कुछ समय के लिए अस्तित्व में रहते हैं।
  • परमानेंट जेनरेशन (नॉन-हीप): वर्चुअल मशीन के सभी रिफ्लेक्टिव डेटा वाले पूल, जैसे कि क्लास और मेथड ऑब्जेक्ट। जावा वीएम के साथ जो वर्ग डेटा साझाकरण का उपयोग करते हैं, यह पीढ़ी केवल-पढ़ने और पढ़ने-लिखने के क्षेत्रों में विभाजित है।
  • कोड कैश (नॉन-हीप): हॉटस्पॉट जावा वीएम में एक कोड कैश भी शामिल है, जिसमें मेमोरी होती है जिसका उपयोग मूल कोड के संकलन और भंडारण के लिए किया जाता है।

जावा जेनरिक कचरा संग्रहण का उपयोग करता है। इसका मतलब यह है कि यदि आपके पास एक वस्तु फू है (जो कुछ वर्ग का उदाहरण है), तो जितना अधिक कचरा संग्रह की घटनाएं बच जाती हैं (यदि अभी भी इसके संदर्भ हैं), तो इसे और बढ़ावा दिया जाता है। यह युवा पीढ़ी में शुरू होता है (जो खुद कई स्थानों पर विभाजित होता है - ईडन और सर्वाइवर) और आखिरकार कार्यकाल की पीढ़ी में खत्म हो जाएगा यदि यह लंबे समय तक जीवित रहा।


2
मेरा मानना ​​है कि जावा 7 के रूप में, स्ट्रिंग्स को अब स्थायी पीढ़ी में इंटर्न नहीं किया जाता है।
टिम गुडमैन

आप सही हैं, मुझे आश्चर्य है कि यह उल्लेख से पहले इतने समय तक जीवित रहा। फिर जावा में 8 स्थायी पीढ़ी को मेटस्पैस द्वारा प्रतिस्थापित किया जाएगा (हालांकि मुझे यकीन नहीं है कि यह वास्तव में कितना अलग होगा, डिफ़ॉल्ट रूप से अनबाउंड होने के अलावा)
जोशुआ मैककिनोन

9
यहोशू - "पुराना" "कार्यकाल" का पर्यायवाची है, और "उत्तरजीवी" का पर्यायवाची "नया" है?
जोधा

1
परमिट जीन केवल जावा 8 से पहले लागू होता है
lwpro2

2
यदि आप अभी भी उत्तर की प्रतीक्षा कर रहे हैं, तो हाँ आप सही हैं @joadha। इस लिंक की जाँच करें: codeahoy.com/2017/08/06/basics-of-java-gar कचरा-collection
रिस्पनांक

197

हीप को युवा और पुरानी पीढ़ी में विभाजित किया गया है:

युवा पीढ़ी : यह वह स्थान है जहाँ छोटी अवधि के लिए रहते थे और दो स्थानों में विभाजित थे:

  • ईडन स्पेस : जब इस स्पेस पर आवंटित नए कीवर्ड मेमोरी का उपयोग करके ऑब्जेक्ट बनाया जाता है।
  • सर्वाइवर स्पेस : यह वह पूल है जिसमें ऐसी वस्तुएँ होती हैं जो ईडन स्पेस से जावा कचरा संग्रह के बाद बच जाती हैं।

पुरानी पीढ़ी : इस पूल में मूल रूप से कार्यकाल और आभासी (आरक्षित) स्थान होता है और उन वस्तुओं को धारण किया जाएगा जो यंग कराधान से कचरा संग्रह के बाद बच गए थे।

  • टेनरेटेड स्पेस: इस मेमोरी पूल में ऑब्जेक्ट्स होते हैं जो कई कचरा संग्रह के बाद बची हुई वस्तु का मतलब होता है जो सर्वाइवर स्पेस से कचरा संग्रह के बाद बच जाता है।

स्थायी सृजन: यह मेमोरी पूल जैसा कि नाम से भी पता चलता है कि इसमें स्थायी वर्ग मेटाडेटा और विवरणकर्ता जानकारी होती है इसलिए PermGen space हमेशा कक्षाओं के लिए आरक्षित होती है और जो कि स्थिर सदस्यों के लिए कक्षाओं से जुड़ी होती है।

Java8 अपडेट: PermGen को Metaspace से बदल दिया गया है जो बहुत समान है।
मुख्य अंतर यह है कि मेटास्पेस पुन: आकार गतिशील रूप से यानी, यह रनटाइम पर विस्तार कर सकता है।
जावा मेटस्पेस स्पेस: अनबाउंडेड (डिफ़ॉल्ट)

कोड कैश (वर्चुअल या आरक्षित): यदि आप हॉटस्पॉट जावा वीएम का उपयोग कर रहे हैं तो इसमें कोड कैश क्षेत्र शामिल है जिसमें मेमोरी शामिल है जिसका उपयोग मूल कोड के संकलन और भंडारण के लिए किया जाएगा।

यहां छवि विवरण दर्ज करें

के सौजन्य से


@Premraj का क्या मतलब है कि Metaspace फिर से आकार में गतिशील रूप से यानी, यह रनटाइम में विस्तार कर सकता है। ? एकमात्र अंतर जो डिफ़ॉल्ट रूप से सीमा तक नहीं है?
gstackoverflow

1
उत्कृष्ट..मुझे पता है कि इस चित्र में विधि क्षेत्र, नेटिवस्टैक और रनटाइम निरंतर पूल कहां रहता है? और उनके अनुसार क्या है?

यदि कोड कैश का उपयोग मूल विधि कोड के लिए किया जाता है, तो देशी विधि क्या है (प्रत्येक थ्रेड में एक होगा) क्या होगा?

49

युवा पीढ़ी क्या है?

युवा पीढ़ी जहां सभी नई वस्तुओं आवंटित और वृद्ध हो रहा है। जब युवा पीढ़ी भर जाती है, तो यह एक मामूली कचरा संग्रह का कारण बनता है। मृत वस्तुओं से भरी एक युवा पीढ़ी को बहुत जल्दी एकत्र किया जाता है। बची हुई कुछ वस्तुएं वृद्ध हैं और अंततः पुरानी पीढ़ी में चली जाती हैं।

पुरानी पीढ़ी क्या है?

पुरानी पीढ़ी में लंबे समय जीवित वस्तुओं स्टोर करने के लिए प्रयोग किया जाता है। आमतौर पर, युवा पीढ़ी के लिए एक सीमा निर्धारित की जाती है और जब वह उम्र पूरी हो जाती है, तो वस्तु पुरानी पीढ़ी में चली जाती है। आखिरकार पुरानी पीढ़ी को इकट्ठा करने की जरूरत है। इस घटना को एक प्रमुख कचरा संग्रह कहा जाता है

स्थायी पीढ़ी क्या है?

स्थायी पीढ़ी शामिल मेटाडाटा JVM द्वारा अपेक्षित वर्गों और तरीकों आवेदन में इस्तेमाल किया वर्णन करने के लिए। अनुप्रयोग द्वारा उपयोग में आने वाली कक्षाओं के आधार पर स्थायी पीढ़ी को जेवीएम द्वारा रनटाइम पर आबाद किया जाता है।

जावा 8 रिलीज़ होने के बाद से पेर्मेन को मेटासैपेस के साथ बदल दिया गया है।

PermSize और MaxPermSize मापदंडों को अब नजरअंदाज कर दिया जाएगा

तीन पीढ़ियाँ आपस में कैसे जुड़ी / जुड़ी हैं?

यहां छवि विवरण दर्ज करें

छवि स्रोत और ओरेकल टेक्नोलोजी ट्यूटोरियल लेख: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" जनरल कूड़ा संग्रह प्रक्रिया " उपरोक्त लेख में कई चित्र के साथ उन दोनों के बीच बातचीत बताते हैं।

सारांश आरेख पर एक नज़र डालें:

यहां छवि विवरण दर्ज करें


उत्कृष्ट..मुझे पता है कि इस चित्र में विधि क्षेत्र, नेटिवस्टैक और रनटाइम निरंतर पूल कहां रहता है? और उनके अनुसार क्या है?

अधिक जानकारी के लिए docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html देखें। विधि क्षेत्र वर्चुअल मशीन स्टार्ट-अप पर बनाया गया है। यद्यपि विधि क्षेत्र तार्किक रूप से ढेर का हिस्सा है, सरल कार्यान्वयन शायद या तो कचरा इकट्ठा करने या इसे कॉम्पैक्ट करने के लिए नहीं चुन सकते हैं। प्रत्येक रन-टाइम निरंतर पूल को जावा वर्चुअल मशीन के विधि क्षेत्र
रविन्द्र बाबू

क्या आपको यकीन है ... ive यह पढ़ रहा है कि इसकी पर्मजेन स्पेस का हिस्सा (जो ढेर नहीं है)? journaldev.com/2856/…

ओरेकल प्रलेखन अधिक प्रामाणिक है
रवींद्र बाबू

क्या समय की इकाइयों (जैसे एमएस) में युवा पीढ़ी के लिए सीमा निर्धारित की गई है? या जीसी दौर?
बहुत उद्देश्य

16

जावा वर्चुअल मशीन को तीन पीढ़ियों में आयोजित किया जाता है: एक युवा पीढ़ी, एक पुरानी पीढ़ी और एक स्थायी पीढ़ी। अधिकांश वस्तुओं को शुरू में युवा पीढ़ी में आवंटित किया जाता है। पुरानी पीढ़ी में वे वस्तुएं हैं जो कुछ संख्या में युवा पीढ़ी के संग्रह से बची हुई हैं, साथ ही कुछ बड़ी वस्तुएं जिन्हें पुरानी पीढ़ी में सीधे आवंटित किया जा सकता है। स्थायी पीढ़ी उन वस्तुओं को रखती है जो जेवीएम को कचरा संग्राहक का प्रबंधन करने के लिए सुविधाजनक लगता है, जैसे कि कक्षाओं और विधियों का वर्णन करने वाली वस्तुएं, साथ ही साथ कक्षाएं और विधियां।


1

SunHotSpot JVM में मेमोरी तीन पीढ़ियों में आयोजित की जाती है: युवा पीढ़ी, पुरानी पीढ़ी और स्थायी पीढ़ी।

  • युवा पीढ़ी: नव निर्मित वस्तुओं को युवा जीन को आवंटित किया जाता है।
  • पुरानी पीढ़ी: यदि नई वस्तु बड़े ढेर स्थान के लिए अनुरोध करती है, तो यह सीधे पुराने जीन में आवंटित हो जाती है। कुछ जीसी चक्रों से बची हुई वस्तुओं को भी पुराने जीन यानी लंबे समय तक जीवित वस्तुओं के घर में रखा जाता है।
  • स्थायी पीढ़ी: स्थायी पीढ़ी उन वस्तुओं को रखती है जो जेवीएम को कचरा संग्राहक का प्रबंधन करने के लिए सुविधाजनक लगता है, जैसे कि कक्षाओं और विधियों का वर्णन करने वाली वस्तुएं, साथ ही साथ कक्षाएं और विधियां।

FYI करें: स्थायी जीन को जावा हीप का हिस्सा नहीं माना जाता है।

तीन पीढ़ियाँ आपस में कैसे संबंध / संबंध रखती हैं? ऑब्जेक्ट्स (बड़े लोगों को छोड़कर) पहले युवा पीढ़ी को आवंटित किए जाते हैं। यदि कोई वस्तु x नं के बाद जीवित रहती है। कचरा संग्रह चक्रों के कारण इसे पुराने / किराएदार जीन को बढ़ावा मिलता है। इसलिए हम कह सकते हैं कि युवा जीन में अल्पकालिक वस्तुएं होती हैं जबकि पुराने जीन में लंबे जीवन वाले पदार्थ होते हैं। स्थायी जीन अन्य दो पीढ़ियों के साथ बातचीत नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.