سؤال

أنا أتطور على منصة الرفع القياسية (Maven and Jetty). أنا مرارا وتكرارا (مرة واحدة كل يومين) الحصول على هذا:

Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN:  handle failed
java.lang.OutOfMemoryError: PermGen space

هذا في بيئة ديف بلدي. إنها ليست مشكلة لأنني يمكنني الاستمرار في إعادة تشغيل الخادم. في النشر، أنا لا أحصل على هذه المشكلات، لذلك ليست مشكلة حقيقية. أنا فقط فضولي.

أنا لا أعرف الكثير عن JVM. أعتقد أنني صحيح في التفكير في أن ذاكرة الجيل الدائم مخصصة للأشياء مثل الفصول الدراسية والأسلوتات المعتشرة؟ ما أتذكره هو مختلط قليلا مع نموذج الذاكرة .NET ...

أي سبب لماذا يحدث هذا؟ هي الإعدادات الافتراضية منخفضة فقط بجنون؟ هل يجب القيام به بكل الكائنات المساعدة التي يجب على scala إنشاء كائنات الوظيفة وأشياء FP مماثلة؟ في كل مرة أعيد فيها إعادة تشغيل Jetty برمز مكتوب حديثا (كل بضع دقائق) أتصور أنه إعادة تحميل الفصول الدراسية وما إلى ذلك، ولكن حتى ذلك، لا يمكن أن يكون الأمر كذلك؟ ولا ينبغي أن تكون JVM قادرا على التعامل مع عدد كبير من الفصول؟

هتافات

جو

هل كانت مفيدة؟

المحلول

من هذا المشنور:

حدث هذا الاستثناء لسبب بسيط واحد:
ال permgenspace هي المكان الذي توجد فيه خصائص الفصل، مثل الأساليب، الحقول، التعليقات التوضيحية، وكذلك المتغيرات الثابتة، إلخ. لذلك إذا كان WebApp الخاص بك يستخدم أو يخلق الكثير من الفصول (أفكر في الأجيال الديناميكية من الفصول)، فمن المحتمل أن تتحقق هذه المشكلة. فيما يلي بعض الحلول التي ساعدتني في التخلص من هذا الاستثناء:

  • -XX:+CMSClassUnloadingEnabled : يتيح هذا الإعداد جمع القمامة في Preshigenspace
  • -XX:+CMSPermGenSweepingEnabled : يسمح لجمع القمامة بإزالة حتى الفئات من الذاكرة
  • -XX:PermSize=64M -XX:MaxPermSize=128M : يثير مقدار الذاكرة المخصصة للبرمجة

قد يكون هذا يمكن أن يساعد.

تحرير يوليو 2012 (بعد حوالي 3 سنوات):

ondra ižka. التعليقات (وأنا قد قمت بتحديث الإجابة أعلاه):

JVM 1.6.0_27 يقول: يرجى استخدام:

  • CMSClassUnloadingEnabled (سواء تم تثبيت تفريغ الفئة عند استخدام CMS GC)
  • بدلا من CMSPermGenSweepingEnabled فى المستقبل

انظر full. Hotspot خيارات JVM - المرجع الكامل ل mroe.

نصائح أخرى

إذا رأيت هذا عند التشغيل 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.

يمكنك أيضا وضع هذه في بيئتك بشكل دائم.

  • لينكس، إلحاق export خط ~/.bashrc

  • لنظام التشغيل Windows، اضغط Win-key + PrintScreen, ، و اذهب Advanced > Environmentوبعد أنظر أيضا http://support.microsoft.com/kb/310519..

هذا بسبب إعادة تحميل الفصول كما اقترحت. إذا كنت تستخدم الكثير من المكتبات وما إلى ذلك. سوف ينمو مجموع الفصول بسرعة لكل إعادة التشغيل. حاول مراقبة مثيل رصاصي مع VisualVM للحصول على نظرة عامة على استهلاك الذاكرة عند إعادة التحميل.

القائمة البريدية (http://groups.google.com/group/liftweb/) هو منتدى الدعم الرسمي للرفع، وأين ستكون قادرا على الحصول على إجابة أفضل. لا أعرف تفاصيل إعداد Dev الخاص بك (لا تذهب إلى تفاصيل أخرى)، لكنني أفترض أنك إعادة تحميل حربك في رصيف دون إعادة تشغيله بالفعل. لا يؤدي المصعد إلى أداء توليد الطبقة الديناميكية (كما اقترح Vonc أعلاه)، لكن Scala يجمع كل إغلاق كطبقة منفصلة. إذا قمت بإضافة وإزالة الإغلاق إلى التعليمات البرمجية الخاصة بك على مدار عدة أيام، فمن الممكن تحميل الكثير من الفصول الدراسية وعدم تفريغها وتناول مساحة بيرم. أقترح عليك تمكين خيارات الخيارات JVM التي ذكرها Vonc أعلاه ومعرفة ما إذا كانت تساعد.

الجيل الدائم هو المكان الذي تضع فيه JVM الأشياء التي قد لا تكون (القمامة) التي تم جمعها مثل Classloaders مخصصين.

اعتمادا على ما تقوم بنشره، يمكن أن يكون إعداد Perm Gen منخفضا. تحتوي بعض التطبيقات و / أو تركيبة الحاويات على تسرب الذاكرة، لذلك عندما يحصل تطبيق تطبيق في بعض الأحيان في بعض الأحيان لا يتم جمع بعض الأشياء مثل رافعات الفئة، مما يؤدي إلى ملء مساحة بيرم وبالتالي توليد الخطأ الذي تواجهه.

لسوء الحظ، حاليا الخيار الأفضل في هذه الحالة هو الحد الأقصى لمسافة Perm مع علامة JVM التالية (مثال على حجم بيرم 192M):

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

الخيار الآخر هو التأكد من أن الحاوية أو الإطار لا تسرب الذاكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top