2009-09-20 11 views
41

के साथ पर्मजेन समस्याएं मैं मानक लिफ्ट प्लेटफार्म (मेवेन और जेट्टी) पर विकास कर रहा हूं। मैं बार-बार (एक बार हर दो बार) यह प्राप्त कर रहा हूं:लिफ्ट और जेटी

Exception in thread "[email protected]" java.lang.OutOfMemoryError: PermGen space 
2009-09-15 19:41:38.629::WARN: handle failed 
java.lang.OutOfMemoryError: PermGen space 

यह मेरे देव पर्यावरण में है। यह कोई समस्या नहीं है क्योंकि मैं सर्वर को पुनरारंभ करना जारी रख सकता हूं। तैनाती में मुझे इन समस्याओं का सामना नहीं करना है, इसलिए यह एक वास्तविक मुद्दा नहीं है। मैं सिर्फ उत्सुक हूँ।

मुझे JVM के बारे में बहुत कुछ पता नहीं है। मुझे लगता है कि मैं सोचने में सही हूं कि स्थायी पीढ़ी की यादें कक्षाओं और आंतरिक तारों जैसी चीजों के लिए हैं? मुझे याद है कि .NET मेमोरी मॉडल के साथ थोड़ा मिश्रित है ...

ऐसा कोई कारण क्यों हो रहा है? क्या डिफ़ॉल्ट सिर्फ पागलपन कम हैं? क्या यह सभी सहायक वस्तुओं के साथ है कि स्काला को फंक्शन ऑब्जेक्ट्स और इसी तरह की एफपी चीजों के लिए बनाना है? हर बार जब मैं जेटी को नए लिखित कोड (हर कुछ मिनट) के साथ पुनरारंभ करता हूं, तो मुझे लगता है कि यह कक्षाएं फिर से लोड करता है। लेकिन फिर भी, यह नहीं हो सकता है कि कितने लोग इसे कर सकें? और क्या JVM बड़ी संख्या में कक्षाओं से निपटने में सक्षम नहीं होना चाहिए?

चीयर्स

जो

+1

https://web.archive.org/web/20150105090518/http://www.scala-blogs.org/2007/12/scala-statically-typed-dynamic-language में उल्लेख किया है। एचटीएमएल लेख: "जेवीएम के पीढ़ी के कचरा कलेक्टर को इस तरह की स्थितियों के लिए अनुकूलित किया गया है और क्योंकि अंतर्निहित रूप से निर्मित वस्तुएं अल्पकालिक हैं, वे जीसी बहुत अच्छी तरह से करेंगे।" लेकिन अगर वे वस्तुएं अल्पकालिक नहीं हैं, तो यह एक और कहानी है। – VonC

उत्तर

44

this post से:
permgenspace है जहां इस तरह के विधियां, फ़ील्ड एनोटेशन, और भी स्थैतिक चर, आदि के रूप वर्ग गुण, में जमा हो जाती:

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

  • -XX:+CMSClassUnloadingEnabled: इस सेटिंग permgenspace
  • -XX:+CMSPermGenSweepingEnabled में कचरा संग्रहण सक्षम बनाता है: कचरा कलेक्टर स्मृति से भी कक्षाओं को दूर करने के लिए अनुमति देता है
  • -XX:PermSize=64M -XX:MaxPermSize=128M: permgenspace

के लिए आवंटित हो सकता है यह मदद कर सकता है स्मृति की मात्रा को जन्म देती है।

संपादित करें जुलाई 2012 (लगभग 3 साल बाद):

Ondra Žižka टिप्पणियां (और मैं इस सवाल का जवाब ऊपर अद्यतन किया है):

JVM 1.6.0_27 का कहना है: का उपयोग करें:

  • CMSClassUnloadingEnabled (चाहे सीएमएस जीसी का उपयोग करते समय कक्षा अनलोडिंग सक्षम हो)
  • के स्थान पर भविष्य में

पूर्ण Hotspot JVM Options - The complete reference mroe के लिए देखें।

+1

धन्यवाद। मैंने सोचा कि या तो जीसी या पर्मजेन के आकार के व्यवहार को समायोजित करने से समस्या हल हो जाएगी।मैं वास्तव में एक विशिष्ट कारण की तलाश में हूं क्यों (/ अगर) लिफ्ट PermGen वस्तुओं को गुब्बारा देगा। – Joe

+1

लिफ्ट द्वारा किए गए कुछ गतिशील वर्ग पीढ़ी के कारण हो सकता है। – VonC

+3

जेवीएम 1.6.0_27 कहता है: कृपया भविष्य में 'CMSPermGenSweepingEnabled' के स्थान पर' CMSClassUnloadingEnabled' का उपयोग करें। –

1

स्थायी पीढ़ी जहां JVM सामान है कि शायद नहीं होगा (कचरा) कस्टम classloaders की तरह एकत्र डालता है।

जो आप तैनात कर रहे हैं उसके आधार पर, परम जीन सेटिंग कम हो सकती है। कुछ एप्लिकेशन और/या कंटेनर संयोजन में कुछ मेमोरी लीक होते हैं, इसलिए जब कोई ऐप बेरोजगार हो जाता है तो कभी-कभी क्लास लोडर जैसे कुछ सामान एकत्र नहीं किए जाते हैं, जिसके परिणामस्वरूप पर्म स्पेस भरना पड़ता है जिससे आप जो त्रुटि कर रहे हैं उसे उत्पन्न करते हैं।

दुर्भाग्य से, वर्तमान में इस मामले में सबसे अच्छा विकल्प अधिकतम अप करने के लिए निम्न JVM ध्वज के साथ पर्म अंतरिक्ष (192m पर्म आकार के लिए उदाहरण) है:

-XX:MaxPermSize=192M (or 256M) 

दूसरा विकल्प यह सुनिश्चित करना है कि या तो कंटेनर या ढांचे स्मृति को रिसाव नहीं करते हैं।

+0

MaxPermSize और 1 9 2 मीटर के बीच '=' होना आवश्यक है। –

2

मेलिंग सूची (http://groups.google.com/group/liftweb/) लिफ्ट के लिए आधिकारिक समर्थन मंच है, और आप एक बेहतर उत्तर प्राप्त करने में सक्षम होंगे। मैं आपके देव सेटअप के विवरणों को नहीं जानता (आप ज्यादा विस्तार से नहीं जाते हैं), लेकिन मुझे लगता है कि आप जेटी में वास्तव में इसे पुनरारंभ किए बिना अपने युद्ध को फिर से लोड कर रहे हैं। लिफ्ट गतिशील वर्ग पीढ़ी (जैसा ऊपर उल्लिखित वीओएनसी द्वारा सुझाया गया है) नहीं करता है, लेकिन स्कैला प्रत्येक बंद को एक अलग वर्ग के रूप में संकलित करता है। यदि आप कई दिनों के दौरान अपने कोड को बंद कर रहे हैं और हटा रहे हैं, तो यह संभव है कि बहुत से वर्ग लोड किए जा रहे हैं और कभी भी अनलोड नहीं किए गए हैं और परम स्पेस ले रहे हैं। मेरा सुझाव है कि आप उपरोक्त वोनसी द्वारा उल्लिखित विकल्पों को सक्षम करें और देखें कि क्या वे मदद करते हैं।

+1

धन्यवाद। मैं आमतौर पर Google समूह पर पोस्ट करता हूं लेकिन मैंने सोचा कि मैं स्टैक ओवरफ्लो को एक जाना चाहूंगा। संख्याओं को बढ़ाने की कोशिश करेंगे। – Joe

3

यह आपके द्वारा सुझाए गए वर्गों को पुनः लोड करने की वजह से है। यदि आप बहुत सारे पुस्तकालयों का उपयोग कर रहे हैं आदि। प्रत्येक पुनरारंभ के लिए कक्षाओं का योग तेजी से बढ़ेगा। पुनः लोड करते समय स्मृति खपत का अवलोकन प्राप्त करने के लिए VisualVM के साथ अपने जेटी इंस्टेंस की निगरानी करने का प्रयास करें।

12

यदि आप mvn jetty:run चलाते समय इसे देखते हैं, MAVEN_OPTS सेट करें।

Linux के लिए:

export MAVEN_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M" 
mvn jetty:run 

विंडोज के लिए:

set "MAVEN_OPTS=-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M" 
mvn jetty:run 

अब ठीक होना चाहिए। यदि नहीं, -XX:MaxPermSize बढ़ाएं।

आप इन्हें स्थायी रूप से अपने पर्यावरण में भी डाल सकते हैं।

  • लिनक्स के लिए, ~/.bashrc

  • विंडोज, प्रेस Win-key + PrintScreen के लिए करने के लिए export लाइन जोड़ने और Advanced > Environment जाना। http://support.microsoft.com/kb/310519 भी देखें।

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