2011-10-14 11 views
6

हम कई कक्षाओं के साथ स्कैला में एक बड़ा जीयूआई ऐप लिख रहे हैं, और हमें सभी वर्गों को लोड करने में सक्षम होने के लिए पर्मजेन स्पेस को बढ़ाना पड़ा है। ऐप स्वयं स्क्रीन-आधारित गतिविधियों की एक श्रृंखला दिखाता है, जिनमें से प्रत्येक कक्षाओं का अपना बड़ा सेट लोड करता है। किसी भी समय केवल एक गतिविधि को लोड/प्रदर्शित किया जाता है। कुछ गतिविधियों के माध्यम से जाने के बाद, हमारे पास PermGen अंतरिक्ष में OutOfMemoryError था।कई क्लासलोडर्स के साथ PermGen स्पेस को सहेजना

मैं समझता हूं कि परमजेन स्पेस garbage collected just like the rest of the heap है, लेकिन मुझे यह देखने में दिलचस्पी है कि क्या मैं Permmen स्पेस को कम करके आवश्यकता कर सकता हूं प्रति ClassLoader प्रति गतिविधि ताकि वर्ग अनलोडिंग की अनुमति दी जा सके।

तो:

  1. मैं समझता हूँ प्रणाली classloader द्वारा लोड कक्षाएं, उतार नहीं किया जा सकता है कि के रूप में वे हमेशा के लिए अपने वर्ग लोडर द्वारा संदर्भित कर दिया जाएगा। क्या यह सच है?
  2. बशर्ते मेरे कस्टम क्लास लोडर द्वारा लोड की गई कक्षा के कोई और उदाहरण न हों, और क्लास लोडर कचरा एकत्र किया जा सकता है, क्या इसकी कक्षाएं अनलोड हो जाएंगी, पर्मजेन स्पेस को मुक्त कर दिया जाएगा?
  3. क्या कक्षाएं उतारने से संबंधित कोई चेतावनी (या सामान्य गलतियों को रोकती है) हैं?
+0

आपका पर्मजेन कितना बड़ा है? –

+0

128 मीटर बहुत छोटा है, अब 256 मीटर काम करता है, लेकिन कितनी देर तक? ... –

उत्तर

6

... यदि मैं अनुमति देने के लिए आवश्यक PermGen स्पेस को कम कर सकता हूं एक क्लासलोडर प्रति गतिविधि ताकि वर्ग अनलोडिंग की अनुमति हो सके।

हां, क्लासलोडर का उपयोग एकमात्र तरीका अनलोड होने के योग्य है यदि क्लासलोडर का उपयोग कचरा होता है। इसका मतलब है कि प्रत्येक एकल वर्ग और क्लासलोडर के संदर्भों को शून्य होना चाहिए।

आपके परमजिन कितना बड़ा है? आप पर्मगेन को बस बंपिंग से दूर कर सकते हैं:

-XX:MaxPermGen=256m 

आपकी कमांड लाइन पर। इसे 512 मीटर पर सेट करना असामान्य नहीं है। यदि आप वास्तव में मजबूत समाधान चाहते हैं, तो आपको एक कस्टम क्लास लोडर प्रति 'गतिविधि' का उपयोग करने का मार्ग जाना होगा। डिबगिंग के साथ मदद करने के लिए, साथ ही साथ अपने आदेश पंक्ति के लिए निम्न आत्म व्याख्यात्मक तर्क जोड़ें:

-XX:+TraceClassLoading 

यह कक्षाएं बाहर प्रिंट होगा के रूप में वे कमांड लाइन के लिए JVM में लोड किए गए हैं।

+0

उत्तर के लिए धन्यवाद। ऐसा लगता है कि '-XX: + TraceClassloading' मैक ओएस एक्स पर मेरे जेआरई संस्करण 1.6.0_26 पर उपलब्ध नहीं है; कोई प्रतिस्थापन? –

+0

-XX: + TraceClassLoading –

+0

ठीक है, यह काम करता है, धन्यवाद। मैं अब '-XX: + TraceClassUnloading' का भी उपयोग करता हूं। –

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