पर्म स्पेस बनाम हीप स्पेस


79

पहला, पर्म स्पेस और हीप स्पेस में क्या अंतर है (प्रत्येक मेमोरी स्पेस का उपयोग करने के लिए जेवीएम क्या और कैसे चुनता है)?

दूसरा, लेकिन सबसे महत्वपूर्ण बात यह है कि एक मानक एमवीसी प्रकार जावा एप्लिकेशन के लिए किस प्रकार के अनुपात की सिफारिश की जाएगी?

जवाबों:


80

ढेर भंडार अपने जावा प्रोग्राम द्वारा बनाई गई वस्तुओं की सभी। हीप की सामग्री को कचरा संग्राहक द्वारा मॉनिटर किया जाता है, जो मेमोरी को उस समय से मुक्त करता है जब आप ऑब्जेक्ट का उपयोग करना बंद कर देते हैं (जब ऑब्जेक्ट के लिए अधिक संदर्भ नहीं होते हैं।

यह स्टैक के विपरीत है , जो आदिम प्रकार जैसे किट्स और चार्ट को संग्रहीत करता है, और आमतौर पर स्थानीय चर और फ़ंक्शन रिटर्न मान हैं। ये कचरा एकत्र नहीं हैं।

पर्म अंतरिक्ष ढेर के एक विशेष भाग को दर्शाता है। स्पष्टीकरण के लिए यह SO उत्तर देखें: Perm space क्या है?


1
आपके द्वारा दिया गया लिंक "ढेर का खंड" कहता है - तो क्या यह वास्तव में "स्टैक का एक विशेष हिस्सा" है? यह ढेर के बजाय (या यहां तक ​​कि स्थैतिक डेटा खंड के कुछ प्रकार) का एक हिस्सा बनने के लिए बहुत अधिक समझ में आता है कि इस तरह की चीज के लिए बस अनुकूल नहीं है।
सर्गेई टैचेनोव

1
यह ढेर का एक विशेष हिस्सा है। आपने टिप्पणी करने से पहले मैंने अपना उत्तर संपादित किया, लेकिन मैं वैसे भी सुधार की सराहना करता हूं :)
ओल्होवस्की

1
दूसरे सवाल पर कोई सिफारिश?
गारेथ

2
@ गैरेथ: इसके बारे में चिंतित होने के लिए कुछ नहीं है। कुछ JVM के पास पर्म स्पेस के लिए मेमोरी का एक समर्पित खंड भी नहीं है। यदि आपको एक java.lang.OutOfMemory अपवाद मिलता है, तो कल्पना करें कि इस उपकरण के साथ कितना परमिट स्थान का उपयोग किया जाता है: अल्फ़ावर्टीसबीम.com / tech / pmat , और फिर यदि आप अनुमति स्थान से बाहर हैं (मेरे अनुभव में दुर्लभ) कमांड लाइन विकल्प के साथ पर्म अंतरिक्ष का आकार बढ़ाने के -XX:MaxPermSize=256m256MB के लिए पर्म अंतरिक्ष आकार निर्धारित करने के लिए।
ओल्होव्स्की

1
ठीक है मैं समझा। तो वास्तव में कोई प्रतिशत नियम या कुछ भी नहीं है। धन्यवाद।
गारेथ

34

व्यक्तिगत रूप से, मैं PermGen को ढेर का एक विशेष हिस्सा नहीं मानूंगा।

मैं बहुत कुछ सोचना चाहता हूं कि ऑब्जेक्ट इंस्टेंसेस को स्टोर करने के लिए समर्पित मेमोरी क्षेत्र के रूप में, जबकि PermGen को वर्ग परिभाषाओं को स्टोर करने के लिए समर्पित क्षेत्र के रूप में। नतीजतन, एक ढेर का जीवनचक्र एक आवेदन से बंधा होता है जबकि पर्मगेन का जीवनचक्र एक जेवीएम से बंधा होता है।

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

ऐसे ही मामलों में से एक है लीकिंग ड्राइवर्स । जब एक ऐप को तैनात किया जाता है, तो एक JDBC ड्राइवर को DriverManager के साथ लोड और पंजीकृत किया जाता है। जब यह ऐप अप्रभावित होता है, तो DriverManager चालक के मूल संदर्भ, उसके मूल श्रेणी लोडर, और इस वर्ग लोडर को लोड किए जाने वाले सभी का संदर्भ रखता है। नतीजतन, PermGen में एक मेमोरी लीक बनाई गई है, लेकिन यह एप्लिकेशन की मेमोरी प्रबंधन की कोई गलती नहीं है।

यह सही है कि जेवीएम जैसे जेवीएम के पास बिल्कुल भी परमिशन नहीं है, सब कुछ ढेर में जमा है। केवल ऐसे संदर्भ में आप PermGen को ढेर का "विशेष हिस्सा" कह सकते हैं। फिर भी, हमें अभी भी PermGen और ढेर को अलग-अलग देखना चाहिए क्योंकि उनका उद्देश्य बहुत अलग है और उनमें बहुत अलग प्रकार की मेमोरी लीक है।

अपडेट : ओरेकल की JDK 8 में, PermGen को "Metaspace" द्वारा बदल दिया गया है और यह अब आधिकारिक रूप से हीप का हिस्सा है। हमें विशेष रूप से किसी भी प्रकार की अनुमति देने की आवश्यकता नहीं होगी।


0

आप ढेर में आवंटित स्मृति को नाम नहीं दे सकते।

इसका मतलब है कि इंट x(इसका नाम) स्टैक में आवंटित किया गया है। आप इसके नाम से पॉइंटर तक पहुंच सकते हैं, इसलिए पॉइंटर स्टैक में है। आप इसके नाम से ऑब्जेक्ट तक नहीं पहुंच सकते, क्योंकि इसका कोई नाम नहीं है। इसके (सूचक) ऑब्जेक्ट को इसके पॉइंटर द्वारा होना चाहिए।

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