ما هو تطبيق JVM المجاني الذي يتمتع بأفضل معالجة لـ PermGen؟

StackOverflow https://stackoverflow.com/questions/1009042

  •  06-07-2019
  •  | 
  •  

سؤال

أقوم بتشغيل Tomcat6 في Sun's JRE6 وكل زوجين ينشران أحصل على OutOfMemoryException:بيرمجين.لقد قمت بالبحث عن حلول PermGen على Google وجربت العديد من الإصلاحات.لا شيء يعمل.قرأت الكثير من الأشياء الجيدة حول Oracle's JRockit وكيف يمكن أن يكون حجم تخصيص PermGen الخاص بها غيغابايت (مقارنة بـ Sun's 128M) وعلى الرغم من أنه لا يحل المشكلة، إلا أنه سيسمح لي بإعادة النشر 100 مرة بين استثناءات PermGen مقارنة بـ 2 مرات الآن.

تكمن مشكلة JRockit في استخدامه في الإنتاج، حيث يتعين عليك شراء WebLogic الذي يكلف آلاف الدولارات.ما هي الخيارات الأخرى (المجانية) الموجودة والتي تكون أكثر تسامحًا مع توسعة PermGen؟كيف تفعل JVMs أدناه في هذا المجال؟

  • آي بي إم جي في إم
  • افتح جي دي كيه
  • أسفل الأسود
  • كافيه

...آحرون؟

تحديث: لقد تساءل بعض الأشخاص عن سبب اعتقادي أن PermGen max كان 128 مليونًا.السبب هو أنه في أي وقت أحاول رفعه فوق 128 ميجا، يفشل جهاز JVM الخاص بي في التهيئة:

[2009-06-18 01:39:44] [info] Error occurred during initialization of VM [2009-06-18 01:39:44] [info] Could not reserve enough space for object heap [2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed

من الغريب أنه يفشل في محاولة حجز مساحة للكائن كومة, ، على الرغم من أنني لست متأكدًا من أنها الكومة "" بدلاً من الكومة "a".

أقوم بتشغيل JVM بسعة 1024 ميجابايت أولية و1536 ميجابايت كحد أقصى.

سأغلق هذا السؤال لأنه تمت الإجابة عليه، أي."التبديل عديم الفائدة" واسأل بدلاً من ذلك لماذا يفشل جهاز Sun JVM الخاص بي مع إعدادات PermGen الأكبر؟

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

المحلول

أتفق مع مايكل بورغواردت في أنه يمكنك زيادة حجم PermGen، ولا أوافق على أن ذلك يرجع في المقام الأول إلى تسرب الذاكرة.يتم استهلاك مساحة PermGen بقوة من خلال التطبيقات التي تنفذ الاستخدام المكثف للانعكاس.لذا، إذا كان لديك تطبيق Spring/Hibernate قيد التشغيل في Tomcat، فكن مستعدًا لزيادة مساحة PermGen هذه كثيرًا.

نصائح أخرى

ما الذي أعطاك فكرة أن Sun's JVM يقتصر على 128M PermGen؟يمكنك ضبطه بحرية باستخدام خيار سطر الأوامر -XX:MaxPermSize؛الافتراضي هو 64M.

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

من الناحية الفنية، يعد تجمع الذاكرة "PermGen" أحد منتجات Sun JVM.لا تسميها JVMs الأخرى ذلك، لكن لديهم جميعًا فكرة وجود واحد أو أكثر من تجمعات الذاكرة غير الكومة.

ولكن إذا كانت لديك مشكلة مع permgen في Sun JVM الخاص بك، فمن غير المرجح أن يؤدي الانتقال إلى JVM آخر إلى حل أي شيء، بل سيظهر فقط تحت اسم مختلف.

إذا تسببت عمليات إعادة التوزيع المتعددة في حدوث مشكلات، فما عليك سوى تعزيز PermGen الخاص بجهاز VM إلى قيم كبيرة.لقد جربنا JRockit منذ فترة بسبب هذه المشكلة بالذات، وهو يعاني من نفس استنفاد إعادة النشر.عدنا إلى SUn JVM.

تغيير JVM ليس حلاً سحريًا.يمكنك الحصول على مشكلات جديدة غير متوقعة (على سبيل المثال.يرى مقالة حول إطلاق تطبيق تحت 4 JVM مختلفة).

  • يمكن أن يكون لديك تسرب للفصل الدراسي (على سبيل المثال.عبر أدوات تحميل الفصول الدراسية) والتي تحدث غالبًا عند إعادة النشر.بصراحة، لم أشاهد مطلقًا عملية إعادة نشر ساخنة على Tomcat (آمل أن أرى ذلك يومًا ما).
  • يمكن أن يكون لديك معلمات JVM غير صحيحة (على سبيل المثال.بالنسبة لـ Sun JDK 6 64 bits -XX:+ يؤدي مفتاح UseParNewGC إلى تسرب شريحة PermGen من الذاكرة.إذا قمت بإضافة مفاتيح إضافية:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled-XX:+CMSPermGenSweepingEnabled سيتم حل الموقف.مضحك، لكنني لم أقابل مطلقًا التسرب المذكور أعلاه مع Sun JDK 6 32 بت). وصلة إلى مقال "ضبط مجموعة البيانات المهملة JVM لعمليات نشر الإنتاج".
  • قد لا تكون قطعة PermGen الخاصة بك كافية لتحميل الفئات والمعلومات ذات الصلة (في الواقع يحدث هذا غالبًا بعد إعادة النشر ضمن Tomcat، حيث تظل الفئات القديمة في الذاكرة ويتم تحميل الفئات الجديدة)

من تجربتي السابقة، يعد تصحيح هذا النوع من التسرب أحد أصعب أنواع تصحيح الأخطاء التي قمت بها على الإطلاق.

[محدث]

مقالة مفيدة كيفية إزالة رابط أداة تحميل الفصل عند إعادة نشر التطبيق.

أستخدم JRockit وما زلت أتلقى أخطاء PermGen إذا لم أقم بزيادة الذاكرة (عبر -XX:MaxPermSize).لا يمكنني أيضًا الحصول على أي شيء للعمل لتجنب الحصول على هذا (بخلاف زيادته).

من المحتمل أن تكون Perm gen هي أبسط ذاكرة يمكن التعامل معها، وأشك في أنه سيكون هناك فرق كبير بين تطبيقات الأجهزة الافتراضية المختلفة.

تأكد من إيقاف تشغيل جميع تكوينات Tomcat التي تم وضع علامة إيقاف تشغيلها في الإنتاج.

نعم، بعض الأطر التي تولد الكثير من الفئات بسرعة، ولكن يجب أن تقوم بالتنظيف بعد نفسها، وعلى أي حال، يمكنك احتواء أكثر من بضع فئات بحجم 128 ميجابايت.

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

ال آي بي إم جي في إم ليس (ولم يكن في عام 2009) لديه بيرمجين.يمكنك قراءة المزيد عنها جامع القمامة المتزامن للأجيال وهو GC الافتراضي الخاص به لـ Java 7.

لقد قمت أحيانًا بتشغيل Eclipse IDE على IBM JVM على وجه التحديد لأنه مع المكونات الإضافية المفضلة لدي، فإنه كثيرًا ما يملأ ترخيص HotSpot JVM.بالتأكيد، ربما كان هناك تسرب للذاكرة كان ينبغي على شخص ما إصلاحه، ولكن في هذه الأثناء لم يتعطل IDE الخاص بي ولم أكن مشغولاً بتجربة إعدادات مختلفة.

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