سؤال

لدينا برنامج جافا يتطلب قدرًا كبيرًا من مساحة الكومة - نبدأه باستخدام الوسيطة -Xmx1500m (من بين وسائط سطر الأوامر الأخرى)، والتي تحدد الحد الأقصى لمساحة الكومة بـ 1500 ميجابايت.عند بدء تشغيل هذا البرنامج على جهاز Windows XP الذي تم إعادة تشغيله حديثًا، سيبدأ تشغيله وتشغيله دون مشاكل.ولكن إذا تم تشغيل البرنامج عدة مرات، وكان الكمبيوتر في وضع التشغيل لفترة من الوقت، وما إلى ذلك، فعندما يحاول بدء التشغيل يظهر لي هذا الخطأ:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

أظن أن نظام Windows نفسه يعاني من تجزئة الذاكرة، لكن لا أعرف كيف أؤكد هذا الشك.في الوقت الذي يحدث فيه ذلك، يبلغ مدير المهام وsysinternals procexp عن وجود ذاكرة خالية تبلغ 2000 ميجابايت.لقد نظرت هذا السؤال يتعلق بالتشرذم الداخلي

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

ملاحظة - تغيير أنظمة التشغيل ليس خيارًا قابلاً للتطبيق حاليًا.

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

المحلول

أتفق مع Torlack، يرجع الكثير من هذا إلى أنه يتم تحميل ملفات DLL الأخرى ودخولها إلى أماكن معينة، مما يؤدي إلى تقسيم مقدار الذاكرة التي يمكنك الحصول عليها لجهاز VM في قطعة واحدة كبيرة.

يمكنك القيام ببعض الأعمال على WinXP إذا كان لديك أكثر من 3G من الذاكرة لتحريك بعض عناصر Windows، ابحث عن PAE هنا:http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

أفضل رهان لك، إذا كنت تحتاج حقًا إلى أكثر من 1.2 جيجا بايت من الذاكرة لتطبيق جافا الخاص بك، هو النظر إلى نظام التشغيل Windows 64 بت أو Linux أو OSX.إذا كنت تستخدم أي نوع من المكتبات الأصلية مع تطبيقك، فسيتعين عليك إعادة ترجمتها لنظام 64 بت، ولكن سيكون الأمر أسهل كثيرًا من محاولة إعادة إنشاء ملفات dll والأشياء لزيادة الذاكرة التي يمكنك الحصول عليها على نظام تشغيل Windows 32 بت .

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

نصائح أخرى

ما لم تكن مساحة ملف الصفحة على وشك النفاد، فهذه المشكلة لا تكمن في نفاد ذاكرة الكمبيوتر.الهدف الأساسي من الذاكرة الظاهرية هو السماح للعمليات باستخدام ذاكرة افتراضية أكبر مما هو متاح فعليًا.

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

لقد كنت أعمل على مشكلة مماثلة في العمل.لقد وجدت أن تشغيل البرنامج باستخدام WinDBG واستخدام الأوامر "!address" و"!address -summary" كان لا يقدر بثمن في تعقب سبب تجزئة مساحة العنوان الافتراضية للعمليات.يمكنك أيضًا تجربة تشغيل البرنامج بعد إعادة التشغيل واستخدام الأمر "!address" لالتقاط صورة لمساحة العنوان ثم القيام بنفس الشيء عندما يتوقف البرنامج عن العمل.هذا قد يدلك على المشكلة.ربما يكون هناك شيء بسيط مثل تحميل DLL إضافي قد يسبب المشكلة.

أظن أن المشكلة تكمن في تجزئة ذاكرة Windows.هناك سؤال آخر هنا على StackOverflow يسمى جافا الحد الأقصى للذاكرة على نظام التشغيل Windows XP يشير ذلك إلى استخدام Process Explorer للنظر في مكان تعيين مكتبات DLL في الذاكرة، ثم معالجة المشكلة عن طريق إعادة تعيين قواعد مكتبات DLL بحيث يتم تحميلها في الذاكرة بطريقة أكثر إحكاما.

باستخدام الحد الأدنى (http://minimem.kerkia.net/) لهذا التطبيق قد يحل مشكلتك.ومع ذلك، لست متأكدًا من أن هذا هو الجواب الذي تبحث عنه.اتمني ان يكون مفيدا.

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

استخدم vmmap من أدوات SysInternals من Microsoft لعرض تجزئة مساحة العنوان الافتراضية، وتحديد ما يؤدي إلى تجزئة المساحة

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