2011-01-31 23 views
73

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

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

उत्तर

75

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

यह ढेर, जो दुकानों के साथ विपरीत में है ints और वर्ण की तरह आदिम प्रकार, और आम तौर पर स्थानीय चर और समारोह वापसी मान हैं ये कचरा एकत्र नहीं कर रहे हैं

पर्म अंतरिक्ष ढेर के एक विशेष भाग को संदर्भित करता है यह इतना एक स्पष्टीकरण के लिए जवाब देखें:।।। What is perm space?

+1

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

+1

यह ढेर का एक विशेष हिस्सा है। मैंने टिप्पणी करने से पहले मैंने अपना जवाब संपादित किया था, लेकिन मैं वैसे भी सुधार की सराहना करता हूं :) – Olhovsky

+1

दूसरे प्रश्न पर कोई सिफारिश? – Gareth

33

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

मैं बहुत वस्तु उदाहरणों स्टोर करने के लिए समर्पित एक स्मृति क्षेत्र के रूप में ढेर के बारे में सोचना पसंद करते हैं, जबकि PermGen वर्ग परिभाषाओं स्टोर करने के लिए समर्पित एक क्षेत्र के रूप में। नतीजतन, एक ढेर का जीवन चक्र एक आवेदन से जुड़ा हुआ है जबकि परमजिन की जीवन चक्र एक जेवीएम से जुड़ा हुआ है।

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

ऐसे मामले में से एक Leaking Drivers है। जब कोई ऐप तैनात किया जाता है, तो एक जेडीबीसी ड्राइवर लोड हो जाता है और DriverManager के साथ पंजीकृत होता है। जब यह ऐप बेरोजगार होता है, तो DriverManager ड्राइवर के संदर्भ में रहता है, इसका मूल वर्ग लोडर, और इस वर्ग लोडर को लोड किया गया सबकुछ। नतीजतन, PermGen में एक स्मृति रिसाव बनाया गया है, लेकिन यह अनुप्रयोग के स्मृति प्रबंधन की कोई गलती नहीं है।

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

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

0

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

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

संबंधित मुद्दे