PermGen और Metaspace में क्या अंतर है?


118

जावा 7 तक जेवीएम मेमोरी में एक क्षेत्र था जिसे पर्मगेन कहा जाता था , जहां जेवीएम अपनी कक्षाएं रखता था। में जावा 8 इसे हटा दिया और कहा जाता है क्षेत्र ने उनकी जगह ली Metaspace ।

PermGen और Metaspace के बीच सबसे महत्वपूर्ण अंतर क्या हैं ?

एकमात्र अंतर जो मुझे पता है कि java.lang.OutOfMemoryError: PermGen spaceअब नहीं फेंका जा सकता है और वीएम पैरामीटर MaxPermSizeको नजरअंदाज कर दिया गया है।


पहला Google परिणाम: infoq.com/articles/Java-PERMGEN-Removed
— the8472

@ the8472 हाँ, लेकिन यह (और कई अन्य) Google परिणाम केवल मेटास्पेस तंत्र का वर्णन करते हैं, इस और पर्मगेन के बीच सटीक अंतर के बारे में कुछ भी उल्लेख नहीं करते हैं।
— काओ

जवाबों:


137

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

एक बड़ी हद तक यह सिर्फ नाम का परिवर्तन है। जब PermGen पेश किया गया था, तब कोई जावा EE या डायनेमिक क्लास (संयुक्त राष्ट्र) लोड नहीं था, इसलिए एक बार लोड होने के बाद यह JVM बंद होने तक मेमोरी में अटक जाता था - इस प्रकार स्थायी पीढ़ी। आजकल कक्षाएं जेवीएम के जीवनकाल के दौरान लोड और अनलोड की जा सकती हैं, इसलिए मेटास्पैस उस क्षेत्र के लिए अधिक समझ में आता है जहां मेटाडेटा रखा गया है।

इन दोनों में java.lang.Classउदाहरण हैं और दोनों ही क्लासलॉकर लीक से पीड़ित हैं । केवल अंतर यह है कि मेटस्पैस डिफ़ॉल्ट सेटिंग्स के साथ, लक्षणों को नोटिस करने तक आपको अधिक समय लगता है (क्योंकि यह ऑटो जितना बढ़ सकता है), यानी आप समस्या को हल किए बिना इसे और आगे बढ़ाते हैं। OTOH मैं कल्पना करता हूं कि OS मेमोरी से बाहर निकलने का प्रभाव केवल JVM PermGen से बाहर चलने की तुलना में अधिक गंभीर हो सकता है, इसलिए मुझे यकीन नहीं है कि यह बहुत सुधार है।

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


17
न तो Permgen, न ही Metaspace में क्लास क्लास के उदाहरण हैं। वे केवल लोडेड कक्षाओं के बारे में मेटा जानकारी रखते हैं। अन्य वर्ग के उदाहरणों की तरह, वर्ग वर्ग के उदाहरण नियमित रूप से ढेर में रखे जाते हैं।
— औसत जो

अच्छी तुलना। धन्यवाद
— संदीप

1
वैसे, OTOH का अर्थ है, "ऑन द अदर हैंड"
— sofs1

43

अलविदा, बाय परमगैन, हैलो मेटस्पैस

PermGen को पूरी तरह से हटा दिया गया है।

मेटासैप्स कचरा संग्रह - कक्षा मेटाडेटा उपयोग तक पहुँचने के बाद मृत वर्गों और क्लास लोडर का कचरा संग्रह शुरू हो जाता है MaxMetaspaceSize।

इस स्थान Metadataको अब आयोजित नहीं किया गया है Java heap, metadataअब देशी स्मृति में एक क्षेत्र के रूप में जाना जाता है Metaspace।

सरल शब्दों में ,

चूंकि कक्षा मेटाडेटा को मूल मेमोरी से बाहर आवंटित किया गया है, इसलिए अधिकतम उपलब्ध स्थान कुल उपलब्ध सिस्टम मेमोरी है। इस प्रकार, आप अब मुठभेड़ नहीं करेंगे OOM errorsऔर स्वैप स्पेस में स्पिलिंग समाप्त कर सकते हैं।

हटाने का PermGenमतलब यह नहीं है कि आपके क्लास लोडर के लीक मुद्दे चले गए हैं। तो, हाँ, आपको अभी भी अपनी खपत की निगरानी करनी होगी और उसी के अनुसार योजना बनानी होगी, क्योंकि एक रिसाव से आपकी पूरी देशी मेमोरी समाप्त हो जाएगी।

विश्लेषण के साथ कुछ अन्य लेख: Link1 , Link2 , और यह


6
MaxPermGen के बजाय आपके पास MaxMetaspaceSize है, इसलिए ऐसा कोई कारण नहीं है कि यह अधिक, या कम मेमोरी का उपयोग करेगा या आपके पास कम नियंत्रण है।
— पीटर लॉरी

2
हम यहाँ किस स्मृति की बात कर रहे हैं? RAM मेमोरी या HDD मेमोरी।
— दिनेश

1
@ दिनेश राम (आन्तरिक स्मृति)
— आदित्य गुप्ता

10

संक्षेप में, मेटास्पैस आकार ऑटो देशी मेमोरी में बढ़ जाता है क्योंकि यदि इसे प्रतिबंधित नहीं किया गया है तो मेटाडेटा लोड करना आवश्यक है -XX:MaxMetaspaceSize

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