2010-09-26 13 views
33

मैंने पढ़ा है कि पर्म जेन (या स्थायी पीढ़ी) अंतरिक्ष कचरा नहीं है। हालांकि, सीएमएस संग्रह में मैं अपने जीसी लॉग में कुछ कक्षाएं अनलोडिंग देख सकता हूं। तो पूर्ण संग्रह या सीएमएस संग्रह के दौरान एकत्रित जीन कचरा है?जावा में स्थायी जनरेशन स्पेस कचरा एकत्रित किया गया है?

+0

की संभावित डुप्लिकेट http://stackoverflow.com/questions/88235/how-to-deal-with -जावा-लैंग-आउटोफमेमोरिअर-परजेन-स्पेस-एरर? वैसे भी उस धागे की जांच करें, यह निश्चित रूप से मदद करेगा। –

+1

नहीं, यह बिल्कुल नकल नहीं है। यह एक अवधारणा प्रश्न है हां/नहीं उत्तर के लिए पूछता है, एक त्रुटि के लिए समाधान मांगने वाला प्रश्न नहीं। – YudhiWidyatama

उत्तर

32

परमजेन ढेर के अन्य हिस्सों की तरह कचरा इकट्ठा किया जाता है।

यह ध्यान देने योग्य बात यह है कि पर्मजेन में वर्गों और वस्तुओं के मेटा-डेटा शामिल हैं, जैसे ऑब्जेक्ट आवंटित किए गए शेष ढेर में पॉइंटर्स। पर्मजेन में क्लास लोडर भी होते हैं जिन्हें उनके उपयोग के अंत में मैन्युअल रूप से नष्ट किया जाना चाहिए, अन्यथा वे स्मृति में रहते हैं और ढेर पर अपनी वस्तुओं के संदर्भ भी रखते हैं। सूर्य/ओरेकल ब्लॉग साइट पर जॉन मसामित्सु द्वारा "Presenting the Permanent Generation" लेख आपको मदद कर सकता है।

+0

सूर्य ब्लॉग प्रविष्टि क्या थी? लिंक काम नहीं करता है ... –

+2

सुधारित। यह एक सन ब्लॉग था इसलिए अब यह ओरेकल ब्लॉग है :) –

+4

मैंने शीर्षक और लेखक को रेखांकित किया है ताकि लिंक फिर से टूट जाए तो लोग इसे पा सकते हैं। –

27

वर्तमान पीढ़ी के जेवीएम में, वास्तव में ढेर के अन्य हिस्सों की तरह परमजन एकत्र किया जाता है। visualgc पृष्ठ बताता है कि यह पुरानी पीढ़ी के साथ एकत्रित किया जाता है।

पुराने जेवीएम में यह स्पष्ट रूप से हमेशा ऐसा नहीं था। उदाहरण के लिए, जावा 5 में सीएमएस कलेक्टर स्पष्ट रूप से डिफ़ॉल्ट रूप से परमैन एकत्र नहीं किया था: आप इसे -XX:+CMSPermGenSweepingEnabled के साथ सक्षम कर सकते हैं। मुझे यह भी याद है कि कुछ वास्तव में पुराने जेवीएम ने परमजन संग्रह को लागू नहीं किया है, हालांकि मुझे इसके लिए एक विश्वसनीय स्रोत नहीं मिल रहा है ... ermm ... "factoid"।

दूसरी बात यह है कि बहुत से लोगों के पास गलत तरीके से को "आउटऑफमेमरी एरर: परमिट" अपवादों को अनुमति नहीं दी जा रही है। वास्तविकता अलग है। इन ओओएमई का सबसे आम कारण एक कपटपूर्ण भंडारण रिसाव है जो प्रकट होता है जब आप निष्पादित JVM में कोड को हॉट-लोड करते हैं। रिसाव तब होता है जब कुछ पुराने वर्ग का एक उदाहरण बदल दिया गया है। इससे ऑब्जेक्ट की कक्षा तक पहुंच योग्य हो जाती है, जिससे क्लास क्लासलोडर पहुंच योग्य हो जाता है, जिससे पुराने वर्गों के सभी पहुंचने योग्य होते हैं, साथ ही उनके कोड ऑब्जेक्ट्स, उनके स्ट्रिंग अक्षर और उनके स्थिर फ्रेम और स्थिर होते हैं। इनमें से बहुत सी लीक ऑब्जेक्ट्स परमजन स्पेस में रहते हैं।


अद्यतन

जावा 8 के रूप में, permgen अब मौजूद नहीं है: PermGen elimination in JDK 8

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