إصلاح: حدث خطأ أثناء تهيئة الجهاز الظاهري لا يمكنه حجز مساحة كافية لكومة الكائنات

على الرغم من أن تطبيقات Java الصغيرة ليست تقنية ويب شائعة هذه الأيام ، إلا أن هناك أسبابًا لا حصر لها لنشر جهاز Java الظاهري مباشرة على خادم Linux. إذا حاولت تشغيل أمر Linux java بشكل مباشر إما على جهاز منفصل أو داخل جهاز افتراضي خاص به ، فقد تحصل على رسالة "حدث خطأ أثناء تهيئة الجهاز الظاهري لم يتمكن من حجز مساحة كافية لكومة الكائنات".

ربما يبدو هذا غريباً إلى حد ما لأن لديك ذاكرة وصول عشوائي (RAM) كافية على الأرجح لتشغيل الأمر ، ولكن هذا يرجع إلى حد كبير إلى شذوذ معين في طريقة استخدام صفحات الذاكرة الفعلية والظاهرية. يجب أن يسمح لك تحديد بعض الأحجام الكبيرة نسبيًا بتجاوز هذه الرسالة تمامًا وتشغيل أمر جافا بالطريقة التي تريدها لأي أمر آخر.

الطريقة الأولى: استخدام خيارات سطر الأوامر

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

جافا وأوامر مجانية

لاحظ أنه على جهاز الاختبار الخاص بنا كان لدينا حوالي 2.3 جيجا بايت من ذاكرة الوصول العشوائي الفعلية ولم يتم استخدام صفحة واحدة من الذاكرة الافتراضية حتى الآن. إذا لاحظت أن لديك أزمة في الذاكرة ، فأنت تريد إغلاق الأشياء الأخرى التي تقوم بتشغيلها قبل المحاولة مرة أخرى. من ناحية أخرى ، يمكن لأولئك الذين وجدوا أن لديهم الكثير من الذاكرة الخالية محاولة تحديد الحجم مباشرة.

على سبيل المثال ، تمكنا على جهازنا من تشغيل الأمر كـ java -Xms256m -Xmx512M وعمل كما كان متوقعًا لولا ذلك. يؤدي هذا إلى تقييد حجم الكومة الذي يحاول جهاز Java الظاهري حجزه عند بدء التشغيل. نظرًا لأن الآلة الافتراضية غير المقيدة يمكنها افتراضيًا القيام بأشياء غير عادية ، فقد تلقي رسائل خطأ على نظام مجاني بخلاف ذلك. قد ترغب أيضًا في التلاعب بهاتين القيمتين قبل العثور على المجموعة الصحيحة.

يمكن أن تكون هذه مشكلة بغض النظر عن ما تقوم بتشغيله عليه لأن JVM لا علاقة له بنوع VM الذي قد تستخدمه لتشغيل GNU / Linux.

الطريقة الثانية: تصدير المتغيرات لجعل التغيير دائمًا

عندما تجد قيمة تعمل ، يمكنك تصديرها لجعلها دائمة لتلك الجلسة. على سبيل المثال ، استخدمنا export _JAVA_OPTIONS = '- Xms256M -Xmx512M' من موجه أوامر bash وسمح لنا بتشغيل أمر java بنفسه دون أي خيارات أخرى حتى نقوم بتسجيل الخروج من الخادم الخاص بنا.

يجب تشغيله مرة أخرى عند تسجيل الدخول إلى جلسة أخرى ، لذلك قد ترغب في إضافته إلى أي نصوص برمجية لبدء التشغيل ذات الصلة إذا كنت تخطط لاستخدام الأمر java كثيرًا. لقد أضفنا السطر إلى ملف .bash_login الخاص بنا ويبدو أنه يعمل في كل مرة استخدمنا فيها مطالبة تسجيل الدخول دون الحاجة إلى تشغيله مرة أخرى ، على الرغم من أنه قد يتعين عليك العثور على موقع آخر له إذا كنت تعمل مع shell مختلف.

ربما لاحظت أن تكوينات أجهزة معينة فقط هي التي تؤدي إلى ظهور رسالة الخطأ هذه. هذا لأنه يحدث عادةً على الأجهزة التي تحتوي على قدر كبير من ذاكرة الوصول العشوائي الفعلية ولكن أقل من ulimits لكيفية استخدامها. ستحاول Java تخصيص كتلة ضخمة فقط ليتم إخبارها بأنها لا تستطيع ، وهو ما يفسره على أنه نفاد الذاكرة.

الطريقة الثالثة: طباعة خيارات Java الحالية

إذا كنت تعمل في سطر الأوامر وتريد مرجعًا سريعًا لما قمت حاليًا بتعيين قيمة _JAVA_OPTIONS إليه ، فما عليك سوى تشغيل echo $ _JAVA_OPTIONS وسيطبع القيم الحالية على الفور. هذا مفيد لاستكشاف الأخطاء وإصلاحها عندما تحاول معرفة الأرقام الصحيحة لتجربتها.

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

في الحالات النادرة التي تبدو فيها إعداداتك صحيحة ولكنها لا تزال لا تعمل ، تأكد من تثبيت حزمة Java 64 بت لأنها يجب أن تكون محصنة ضد هذه المشكلة. تنطبق متطلبات الذاكرة المجاورة فقط على إصدار 32 بت من Java. وجدنا في عدد قليل من الحالات أن الإصدار 64 بت حاول إنشاء جهاز افتراضي 32 بت ، لذا فإن تحديد الخيار -d64 في سطر الأوامر قد أصلحه لنا.