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