أصلح “OutOfMemoryError: Java heap space” و“Could not reserve enough space” على خادم Minecraft
ثلاث مشكلات مختلفة تُسمّى “out of memory”. إذا لم يبدأ الخادم وذكر object heap، فقد طلبت من Java ذاكرة RAM أكبر مما يملكه الجهاز. وإذا عمل ثم انهار مع OutOfMemoryError، فقد احتاج أكثر مما أعطيته، أو أن شيئًا ما يتسرّب. وإذا قال “Killed” فقط، فقد أنهاه نظام التشغيل.
أي خطأ لديك؟
| الرسالة | ما معناه |
|---|---|
| Could not reserve enough space for object heap | عند البدء: -Xmx أكبر من الذاكرة المتاحة، أو أنك تستخدم Java بنظام 32 بت. |
| java.lang.OutOfMemoryError: Java heap space | أثناء التشغيل: الـ heap ممتلئ. يحتاج الخادم إلى ذاكرة أكبر أو حمل أقل، أو لديه تسرّب. |
| GC overhead limit exceeded | يقضي Java معظم وقته في تنظيف الذاكرة. أسبابه هي نفسها أسباب امتلاء الـ heap. |
| “Killed” أو exit code 137 | أنهى نظام التشغيل أو الحاوية الخادم لأن الجهاز كله نفدت ذاكرته. |
Could not reserve enough space for object heap
- تحقق من الذاكرة الحرة. على Linux، شغّل
free -h. وعلى Windows، افتح Task Manager. - اخفض -Xmx. يستخدم Java أكثر من الـ heap، لذا على جهاز صغير اجعل -Xmx ثلاثة أرباع الذاكرة كحدّ أقصى تقريبًا. وعلى خادم 4 GB، تُعد 3G سقفًا آمنًا.
- استخدم Java بنظام 64 بت. يجب أن تذكر مخرجات
java -versionالعبارة 64-Bit. ولا يستطيع Java بنظام 32 بت حجز heap كبير.
java -Xms3G -Xmx3G -jar server.jar --nogui
اضبط -Xms على القيمة نفسها لـ -Xmx، ليحجز الخادم ذاكرته مرة واحدة عند البدء.
java.lang.OutOfMemoryError: Java heap space
- أعطِ الخادم ذاكرة أكبر، إن كان الجهاز يملكها. راجع كم من RAM يحتاجه خادم Minecraft لمعرفة الأحجام بحسب نوع الخادم.
- خفّف الحمل. اخفض
view-distanceوsimulation-distanceفي server.properties، مثلًا إلى 8 و6. - ابحث عن تسرّب. ثبّت إضافة spark أو مودها، واترك الخادم يعمل حتى ترتفع الذاكرة، ثم شغّل
/spark heapsummary. يسرد ما يستهلك أكبر قدر من الذاكرة. وفئات من إضافة واحدة في أعلى القائمة تشير إلى المسبّب. - حدّث المسبّب أو أزله. كثيرًا ما تُصلح تسرّبات الذاكرة في إصدار أحدث من الإضافة. وإعطاء إضافة متسرّبة ذاكرة أكبر لا يؤخر الانهيار إلا قليلًا.
- أعد التشغيل بجدول زمني. إعادة تشغيل يومية تخفي تسرّبًا بطيئًا إلى أن تجده. هذا حل مؤقت لا إصلاح.
“Killed” وexit code 137
هذا ليس خطأ Java. على Linux، يُنهي killer نفاد الذاكرة (out-of-memory killer) أكبر عملية حين تنفد ذاكرة الجهاز كله، وتفعل الحاويات الشيء نفسه عند حدّ ذاكرتها. تأكد من ذلك في سجل النواة:
sudo dmesg | grep -i "killed process"
للإصلاح، اخفض -Xmx بحيث يتسع Java مع كل شيء آخر على الجهاز في الـ RAM، وأوقف البرامج الأخرى الشرهة للذاكرة، مثل قاعدة بيانات أو خادم لعبة ثانٍ. ملف swap صغير يعمل كشبكة أمان، لا كبديل عن RAM.
امنع تكرار المشكلة
- اختر حجم الـ heap بحسب نوع الخادم وعدد اللاعبين، ثم راقب الاستخدام الفعلي باستخدام spark.
- ولّد العالم مسبقًا، حتى لا يرفع توليد الـ chunks الذاكرة فجأة بينما يستكشف اللاعبون.
- أبقِ الإضافات وبرنامج الخادم محدّثين.
استضف خادم Minecraft في سنغافورة
ping منخفض للاعبين في الهند وماليزيا وإندونيسيا، على أنوية AMD EPYC سريعة مع NVMe وحماية من DDoS.
