PermGen वास्तव में किसके लिए खड़ा है?


122

मुझे पता है कि PermGen क्या है, इसका क्या उपयोग किया जाता है, यह क्यों विफल हो जाता है, इसे कैसे बढ़ाया जाए आदि।

मुझे नहीं पता कि परमजीन वास्तव में किसके लिए खड़ा है। स्थायी ... जनरल ... कुछ?

क्या किसी को पता है कि PermGen वास्तव में किसके लिए खड़ा है?


1
[अच्छा विवरण] [1] उस व्यक्ति से जो जीसी इंटर्नल के बारे में बहुत कुछ जानता है। उनके ब्लॉग में उपयोगी जीसी-संबंधित जानकारी के बहुत सारे तरीके हैं। [1]: blogs.oracle.com/jonthecollector/entry/...
इवान Dubrov

जवाबों:


84

स्थायी पीढ़ी। विवरण पाठ्यक्रम कार्यान्वयन के विशिष्ट हैं।

संक्षेप में, इसमें जावा ऑब्जेक्ट्स कक्षाओं और आंतरिक तारों से जुड़े हैं। शेयरिंग के साथ सन के क्लाइंट कार्यान्वयन में, classes.jsaप्रारंभिक डेटा बनाने के लिए मेमोरी मैप किया जाता है, जिसमें लगभग आधा रीड-ओनली और आधा कॉपी-ऑन-राइट होता है।

जावा ऑब्जेक्ट जो केवल पुराने हैं, उन्हें टेनडर्ड जेनरेशन में रखा जाता है।


19
"JDK 7 में, इंटर्न स्ट्रिंग्स को अब जावा हीप की स्थायी पीढ़ी में आवंटित नहीं किया गया है": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almavawi

30
और JDK 8 में कोई स्थायी पीढ़ी नहीं है! यह जवाब देखने में मजेदार है कि यह वर्षों से विकसित है।
ब्रायन गॉर्डन

3
@BrianGordon सही है .. इसके बारे में अधिक जानकारी के लिए: stackoverflow.com/a/22509753/4557537
Fadi

59

PermGen का उपयोग JVM द्वारा लोड की गई कक्षाओं को रखने के लिए किया जाता है। आप इसका उपयोग करके इसे बढ़ा सकते हैं:

-XX:MaxPermSize=384m

यदि आप Sun JVM या OpenJDK का उपयोग कर रहे हैं।

इसलिए अगर आपको आउटऑफमेरी एक्ससेप्शन मिलता है: परमगान आपको या तो पर्मगेन को बड़ा करने की जरूरत है या आपको क्लास लोडर की समस्या हो सकती है।


6
जिस समय आपने यह टिप्पणी पोस्ट की थी उस समय कौन सा उत्तर स्वीकार किया गया था? वर्तमान में स्वीकृत उत्तर ( यह एक , "टॉम हैटिन - टैकललाइन" द्वारा) मुझे सटीक लगता है। अपनी टिप्पणी को संपादित करने के लिए समझ में आता है ताकि यह लोगों को वर्तमान स्वीकृत उत्तर को अविश्वास करने के लिए प्रेरित न करे?


8

वास्तव में मूल प्रश्न से संबंधित मैच नहीं है, लेकिन हो सकता है कि कोई इसे उपयोगी समझेगा। PermGen वास्तव में स्मृति में एक क्षेत्र है जहां जावा अपनी कक्षाएं रखने के लिए उपयोग किया जाता था। तो, हम में से कई लोग ओर्म में आए हैं पर्मगेन में, अगर वहाँ थे, उदाहरण के लिए बहुत सारी कक्षाएं।

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




3

अगर मुझे सही ढंग से याद है, तो पीढ़ी पीढ़ी के लिए खड़ा है, जैसा कि एक पीढ़ीगत कचरा कलेक्टर (जो कि मध्य-जीवन और "स्थायी" वस्तुओं की तुलना में छोटी वस्तुओं का अलग-अलग व्यवहार करता है)। स्थानीयता का सिद्धांत बताता है कि हाल ही में बनाई गई वस्तुओं को पहले मिटा दिया जाएगा।


1

पर्मेन स्थायी सृजन के लिए खड़ा है। यह जेवीएम स्मृति क्षेत्रों में से एक है। यह MaxPermSize नामक ध्वज का उपयोग करके निश्चित आकार के साथ हीप का हिस्सा है।

क्यों नाम "PermGen"?

जावा के शुरुआती दिनों में इस परमिट का नाम रखा गया था। Permgen mains लोडेड क्लासेस के सभी मेटा डेटा को रखता है। लेकिन समस्या यह है कि एक बार लोड होने के बाद यह JVM में JVM के बंद होने तक रहेगा। तो नाम permgen उस के लिए विकल्प है। लेकिन बाद में, कक्षाओं का गतिशील लोडिंग चित्र में आ गया लेकिन नाम नहीं बदला गया। लेकिन जावा 8 के साथ , उन्होंने उस मुद्दे को भी संबोधित किया है। अब permagen का नाम दिया गया MetaSpace गतिशील स्मृति आकार के साथ।

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