जावा मेमोरी पूल कैसे विभाजित है?


224

मैं वर्तमान में jconsole के साथ जावा एप्लिकेशन की निगरानी कर रहा हूं। मेमोरी टैब आपको इसके बीच चयन करने देता है:

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

उनके बीच क्या अंतर है ?


यह मानते हुए कि आप Sun JDK का उपयोग कर रहे हैं, सबसे अच्छा उत्तर उनके प्रलेखन में मिलेगा: ट्यूनिंग कचरा संग्रह (JDK 1.5) और कचरा संग्रह FAQ (JDK 1.4)
kdgregory

जवाबों:


327

ढेर स्मृति

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

  • ईडन स्पेस : वह पूल जहां से मेमोरी को शुरू में ज्यादातर वस्तुओं के लिए आवंटित किया जाता है।

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

  • टेनरेटेड जेनरेशन या ओल्ड जनरल : बचे हुए स्थान में कुछ समय के लिए मौजूद रहने वाले पूल।

गैर-ढेर स्मृति

गैर-हीप मेमोरी में जावा वीएम के लिए आंतरिक प्रसंस्करण या अनुकूलन के लिए आवश्यक सभी थ्रेड्स और मेमोरी के बीच साझा एक विधि क्षेत्र शामिल है। यह प्रति-वर्ग संरचनाओं जैसे कि एक रनटाइम निरंतर पूल, फ़ील्ड और विधि डेटा, और विधियों और निर्माणकर्ताओं के लिए कोड संग्रहीत करता है। विधि क्षेत्र तार्किक रूप से ढेर का हिस्सा है लेकिन, कार्यान्वयन के आधार पर, एक जावा वीएम कचरा इकट्ठा नहीं कर सकता है या इसे कॉम्पैक्ट नहीं कर सकता है। हीप मेमोरी की तरह, विधि क्षेत्र एक निश्चित या परिवर्तनशील आकार का हो सकता है। विधि क्षेत्र के लिए मेमोरी को सन्निहित होने की आवश्यकता नहीं है।

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

  • कोड कैश : हॉटस्पॉट जावा वीएम में एक कोड कैश भी शामिल है, जिसमें मेमोरी होती है जिसका उपयोग मूल कोड के संकलन और भंडारण के लिए किया जाता है।

Jconsole का उपयोग करने के बारे में कुछ दस्तावेज यहां दिए गए हैं


4
मुझे यकीन नहीं है कि @dfa पूरी तरह से सही है क्योंकि Java Virtual Machine Specification स्पष्ट रूप से बताता है: "हालांकि विधि क्षेत्र तार्किक रूप से ढेर का हिस्सा है, साधारण कार्यान्वयन या तो कचरा इकट्ठा करने या इसे कॉम्पैक्ट करने के लिए नहीं चुन सकते हैं।" हालांकि यह स्पष्ट है कि जोंको कंसोल कोड कैश और स्थायी जनरेशन को गैर-हीप के रूप में दिखाता है, जो विनिर्देशन के विपरीत लगता है। क्या कोई इस विरोधाभास पर अधिक स्पष्टता प्रदान कर सकता है?
जेम्स ब्लूम

@JamesBloom - मैं वही सोच रहा था। भले ही मूल परिभाषा में कहा गया हो कि कौन सा मेमोरी पूल किस प्रकार (हीप / नॉन-हीप) से संबंधित है, लेकिन यह स्पष्ट रूप से बदल सकता है?
उमंग देसाई

2
डॉक्टर को इस बात से अवगत कराया गया था: docs.intergral.com/pages/viewpage.action?pageId=22478944 डॉक में JVM के बारे में कुछ अन्य अच्छी जानकारी है, एक ब्राउज़ के लायक
स्टीव

1
बहुत सारे अपवोट के बावजूद, यह वास्तव में इतना सार्थक जवाब नहीं है। उदाहरण के लिए, "ऑब्जेक्ट्स जो ईडन स्पेस के कचरा संग्रह से बच गए हैं" का क्या मतलब है? क्या ये वस्तुएं जीवित रहने के बाद ईडन से सर्वाइवर स्पेस में चली गईं, या ईडन में उनके स्पेस को सर्वाइवर स्पेस माना जाता है? और ईडन स्पेस के अलावा अन्य पूलों में कचरा संग्रहण के बारे में क्या होता है? पूरी तरह से स्पष्ट नहीं है।
मिखाइल बैटसर

और स्टैक (नॉन-हीप साइड) पर मत भूलना :)
टूथलेस सीयर

70

नया कीवर्ड जावा हीप पर मेमोरी आवंटित करता है। ढेर मेमोरी का मुख्य पूल है, जो पूरे अनुप्रयोग के लिए सुलभ है। यदि उस ऑब्जेक्ट के लिए आवंटित करने के लिए पर्याप्त मेमोरी उपलब्ध नहीं है, तो जेवीएम कचरे के संग्रह के साथ ढेर से कुछ मेमोरी को पुनः प्राप्त करने का प्रयास करता है। यदि यह अभी भी पर्याप्त मेमोरी प्राप्त नहीं कर सकता है, तो एक OutOememoryError फेंक दिया जाता है, और JVM बाहर निकलता है।

ढेर को कई अलग-अलग वर्गों में विभाजित किया जाता है, जिन्हें पीढ़ियों कहा जाता है। जैसे ही वस्तुएँ अधिक कचरा संग्रहण से बच जाती हैं, उन्हें विभिन्न पीढ़ियों में बढ़ावा दिया जाता है। पुरानी पीढ़ियों को अक्सर इकट्ठा नहीं किया जाता है। क्योंकि ये वस्तुएं पहले से ही लंबे समय तक जीवित साबित हुई हैं, वे कचरा एकत्र होने की संभावना कम हैं।

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

एक चौथी पीढ़ी भी है, जिसे परमानेंट जेनरेशन या पर्मगेन कहा जाता है। यहां रहने वाली वस्तुएं कचरा एकत्र करने के योग्य नहीं हैं, और आमतौर पर जेवीएम को चलाने के लिए आवश्यक एक अपरिवर्तनीय स्थिति होती है, जैसे कि कक्षा परिभाषाएं और स्ट्रिंग स्थिर पूल। ध्यान दें कि PermGen स्पेस को Java 8 से हटाने की योजना है, और इसे Metaspace नामक एक नए स्पेस से बदला जाएगा, जो कि देशी मेमोरी में आयोजित किया जाएगा। संदर्भ j http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

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


आरेख बहुत आत्म व्याख्यात्मक दिखता है ... क्या यह किसी भी जीसी एल्गोरिथ्म के लिए मान्य है। G1 के अलग-अलग सेट हैं।
वेंकटेश्वर राव

@Pythoner मुझे लगता है कि गहरे बैंगनी रंग में ध्वज होना चाहिए -XX:PermSize-XX:MaxPermSizeकि जैसा कि यह पहले से ही परिभाषित है।
अनुराग

35

Java8 के साथ, गैर हीप क्षेत्र में PermGen नहीं है, लेकिन Metaspace, जो Java8 में एक बड़ा बदलाव है, जावा के साथ मेमोरी त्रुटियों से छुटकारा पाने के लिए माना जाता है क्योंकि क्लास डेटा के लिए jvm द्वारा आवश्यक स्थान के आधार पर मेटास्टेस आकार को बढ़ाया जा सकता है।


1
दरअसल, मेटस्पैस और क्लास स्पेस है: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/…
mrswadge

23

जावा हीप मेमोरी ऑपरेटिंग सिस्टम द्वारा JVM को आवंटित मेमोरी का हिस्सा है।

ऑब्जेक्ट्स एक क्षेत्र में रहते हैं जिसे ढेर कहा जाता है। ढेर तब बनाया जाता है जब जेवीएम शुरू होता है और आवेदन के समय आकार में वृद्धि या कमी हो सकती है। जब ढेर पूरा हो जाता है, तो कचरा एकत्र किया जाता है।

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

आप SE प्रश्न के नीचे ईडन स्पेस, सर्वाइवर स्पेस, टेन्योर स्पेस और परमानेंट जेनरेशन के बारे में अधिक जानकारी प्राप्त कर सकते हैं :

यंग, टेन्योर और पर्म जेनरेशन

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

आपके प्रश्नों के बारे में:

  1. ईडन स्पेस, सर्वाइवर स्पेस, टेन्योर स्पेस, ढेर मेमोरी का हिस्सा हैं
  2. मेटास्पैस और कोड कैश गैर-ढेर स्मृति का हिस्सा हैं।

कोडेचे: जावा वर्चुअल मशीन (जेवीएम) देशी कोड उत्पन्न करता है और इसे मेमोरी एरिया में स्टोर करता है जिसे कोडाचे कहा जाता है। JVM डायनामिक रूप से जेनरेट किए गए इंटरप्रेटर लूप, जावा नेटिव इंटरफेस (JNI) स्टब्स, और जावा विधियों के लिए मूल कोड उत्पन्न करता है, जो कि जस्ट-इन-टाइम (JIT) कंपाइलर द्वारा मूल कोड में संकलित किए जाते हैं। JIT अब तक कोडेक का सबसे बड़ा उपयोगकर्ता है।

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